136

Is there some mechanism by which I can be notified (in C#) when a file is modified on the disc?

1
  • 2
    See this answer for more information on the FileSystemWatcher class and the events it raises. Commented Apr 21, 2012 at 13:02

3 Answers 3

246

You can use the FileSystemWatcher class.

public void CreateFileWatcher(string path) { // Create a new FileSystemWatcher and set its properties. FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = path; /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */ watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Only watch text files. watcher.Filter = "*.txt"; // Add event handlers. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; } // Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); } private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); } 
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks for the nice example. I'll also point out that you can use the method WaitForChanged on FileSystemWatcher if you are looking for a blocking (synchronous) way to watch for changes.
Thanks for this example. The MSDN has pretty much the same here. Also, some people might want to watch a whole directory tree - use watcher.IncludeSubdirectories = true; to achieve that.
OnChange fires without actual change (e.g: hitting ctrl+s without any actual change), is there any way to detect fake changes?
@MehdiDehghani: Not that I know of, the only way seems to be to actually keep a snapshot of the file and compare that byte-wise to the current (presumably changed) version. The FileSystemWatcher only is able to detect events at the file system level (i.e. if the OS triggers an event). In your case Ctrl+S triggers such an event (whether that happens or not depends on the actual application though).
Is FileSystemWatcher cross-platform ?
|
75

That would be System.IO.FileSystemWatcher.

Comments

7

Use the FileSystemWatcher. You can filter for modification events only.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.