Optimize File Monitoring with Custom .Net8.FileSystemWatcher in .NET

In .NET 8, the FileSystemWatcher.cs functionality seems to be malfunctioning. To address this issue, I've developed a custom solution packaged as 'Custom.Net8.FileSystemWatcher'.It offers functionality akin to FileSystemWatcher.

I can guide you on how you might structure such a custom implementation.

Step 1. Set Up Your Project. I have used the WPF project for it.

Step 2. Add a Necessary NuGet Package like the one below.

NuGet Package 

Step 3. Implement View for handling different requests like below.

<Window x:Class="WpfAppTester.MainWindow"
        Title="MainWindow" Height="450" Width="800">

                <RowDefinition Height="*"/>
                <RowDefinition Height="50"/>

            <TextBox x:Name="TxtBxDemo" Grid.Row="0" BorderBrush="LightBlue" BorderThickness="4" Margin="5"/>

            <StackPanel Orientation="Horizontal" Grid.Row="1">
                <Button x:Name="BtnFileCreated" FontSize="15" Content="File Created" Width="200" Click="BtnFileCreated_Click" Margin="5"/>
                <Button x:Name="BtnFileModified" FontSize="15" Content="File Modified" Width="200" Click="BtnFileModified_Click" Margin="5"/>
                <Button x:Name="BtnFileDeleted" FontSize="15" Content="File Deleted" Width="200" Click="BtnFileDeleted_Click" Margin="5"/>
                <Button x:Name="BtnFileRenamed" FontSize="15" Content="File Renamed" Width="200" Click="BtnFileRenamed_Click" Margin="5"/>



Step 4. Implement CustomFileSystemWatcher like below

using Custom.Net8.FileSystemWatcher;
using System.IO;
using System.Text;
using System.Windows;

namespace WpfAppTester
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
        CustomFileSystemWatcher FileSystemWatcher { get; set; }
        public MainWindow()
            FileSystemWatcher = new CustomFileSystemWatcher()
                // This field is required when the user requires notifications from the file system for any changes that occur.
                EnableRaisingEvents = true,

                // When the user wishes to monitor changes not only in the root folder but also in its subfolders.
                // If this feature is disabled, changes that occur in the subfolders will not be monitored.
                IncludeSubdirectories = true,

                // Substitute it with the root directory path of your choice.
                Path = @"C:\Users\sanjay\Desktop\FileGallary",

                // This field must be enabled if the user intends to initiate and monitor changes in a file system.
                FileWatcherStarted = true,

                // The use of the combination of "FileFilter" and "ExtensionType" is solely intended for situations where the user explicitly wishes to inspect changes within a single file.
                // FileFilter = "DemoFile",
                // ExtensionType = ".txt",

                // If the user wishes to exclusively search for files with any extension type.
                // FileFilter = "*.txt",

                // If the user wants to search for a file of any type with any extension.
                FileFilter = "*.*",

            FileSystemWatcher.FileCreated += FileSystemWatcher_FileCreated;
            FileSystemWatcher.FileDeleted += FileSystemWatcher_FileDeleted;
            FileSystemWatcher.FileModified += FileSystemWatcher_FileModified;
            FileSystemWatcher.FileRenamed += FileSystemWatcher_FileRenamed;

        private void FileSystemWatcher_FileRenamed(object? sender, Custom.Net8.FileSystemWatcher.Utilities.CustomRenamedEventArgs e)
            MessageBox.Show("File Renamed");

        private void FileSystemWatcher_FileModified(object? sender, Custom.Net8.FileSystemWatcher.Utilities.CustomFileSystemEventArgs e)
            MessageBox.Show("File Modified");

        private void FileSystemWatcher_FileDeleted(object? sender, Custom.Net8.FileSystemWatcher.Utilities.CustomFileSystemEventArgs e)
            MessageBox.Show("File Deleted");

        private void FileSystemWatcher_FileCreated(object? sender, Custom.Net8.FileSystemWatcher.Utilities.CustomFileSystemEventArgs e)
            MessageBox.Show("File Created");

        private void BtnFileCreated_Click(object sender, RoutedEventArgs e)
            // Check if the file already exists
            if (!File.Exists(System.IO.Path.Combine(@"C:\Users\sanjay\Desktop\FileGallary", "DemoFile.txt")))
                // Create the file and write some content
                using (FileStream fs = File.Create(System.IO.Path.Combine(@"C:\Users\sanjay\Desktop\FileGallary", "DemoFile.txt")))
                    // Write content to the file
                    string content = TxtBxDemo.Text;
                    byte[] bytes = Encoding.UTF8.GetBytes(content);
                    fs.Write(bytes, 0, bytes.Length);
                MessageBox.Show("File already exists.");

        private void BtnFileModified_Click(object sender, RoutedEventArgs e)
            if (File.Exists(System.IO.Path.Combine(@"C:\Users\sanjay\Desktop\FileGallary", "DemoFile.txt")))
                File.WriteAllText(System.IO.Path.Combine(@"C:\Users\sanjay\Desktop\FileGallary", "DemoFile.txt"), TxtBxDemo.Text);
                MessageBox.Show("File does not exist.");

        private void BtnFileDeleted_Click(object sender, RoutedEventArgs e)
            File.Delete(System.IO.Path.Combine(@"C:\Users\sanjay\Desktop\FileGallary", "DemoFile.txt"));

        private void BtnFileRenamed_Click(object sender, RoutedEventArgs e)
            // Specify the current file path and the new file path
            string currentFilePath = @"C:\Users\sanjay\Desktop\FileGallary\DemoFile.txt";
            string newFilePath = @"C:\Users\sanjay\Desktop\FileGallary\Renamedfilename.txt";
                // Create a FileInfo 
                System.IO.FileInfo fi = new System.IO.FileInfo(currentFilePath);
                // Check if file is there 
                if (fi.Exists)
                    // Move file with a new name. Hence renamed. 
                    Console.WriteLine("File Renamed.");
            catch (Exception ex)
                Console.WriteLine($"An error occurred: {ex.Message}");

Step 5. Result of some actions

The action has resulted in the creation of a file.

File Created

The action has resulted in the modification of a file.


The action has resulted in the renaming of a file.


Notes. Implement additional logic as needed inside the event handlers of the CustomWatcher implementation.

Repository Path: https://github.com/OmatrixTech/WpfAppTester

Recommended Free Ebook
Similar Articles