Is there some mechanism by which I can be notified (in C#) when a file is modified on the disc?
3 Answers
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); } 6 Comments
Mark Meuer
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.
Mehdi Dehghani
OnChange fires without actual change (e.g: hitting ctrl+s without any actual change), is there any way to detect fake changes?Dirk Vollmar
@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).Vaidotas Beržinskas
Is FileSystemWatcher cross-platform ?
|