C# : Trapping File Change Notifications – Windows Form Example

I wanted to try writing a utility similar to Filemon myself – to just trap the FCNs for a particular file or folder. My utility is not superior than Filemon – Filemon is one wonderful tool which helps a lot of people daily in their day-to-day troubleshooting activities.

FileSystemWatcher is a Class in System.IO which helped me doing this. It turned out to be very simple to do this. I can imagine how tough it would’ve been if I’m not in the .NET world and my Visual Studio makes my job more easier with its powerful Intellisense.

Here is my code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FCN
    public partial class Form1 : Form
        FileSystemWatcher fsw;
        public Form1()
            fsw = new FileSystemWatcher();
            fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            fsw.Changed += new FileSystemEventHandler(OnChanged);
            fsw.Created += new FileSystemEventHandler(OnChanged);
            fsw.Deleted += new FileSystemEventHandler(OnChanged);
            fsw.Renamed += new RenamedEventHandler(OnRenamed);
            listBox1.ScrollAlwaysVisible = true;
            listBox1.HorizontalScrollbar = true;
        private void button1_Click(object sender, EventArgs e)
            textBox1.Text = folderBrowserDialog1.SelectedPath;
        private void button2_Click(object sender, EventArgs e)
            fsw.Path = textBox1.Text;
            fsw.IncludeSubdirectories = true;
            fsw.EnableRaisingEvents = true;
        void OnChanged(object source, FileSystemEventArgs e)
           listBox1.Items.Add("File: " + e.FullPath + " " + e.ChangeType);
        void OnRenamed(object source, RenamedEventArgs e)
            listBox1.Items.Add("File: " + e.OldFullPath + " renamed to " + e.FullPath);

Very simple code indeed. My Windows form looks like below:


Happy Learning!

Comments (2)

  1. Sven says:

    Ok i’m probably doing something wrong but i got this problem.

    When i try this out i get an error saying i can’t do this in multiple threads, there was access to the control (the listbox) from another thread then the thread where the control was made in. Never seen the error before so i have no idea.

    Got the same code as you have.

    Any idea what i need to do now to make it work ?

  2. Sven says:

    Ok found a solution to my problem.

    I added this line:

    fsw.SynchronizingObject = this;

    Otherwise the event handler was executed on a thread of the thread pool and it had to run in the same thread as the form