I have been doing a lot of research off late for one of my clients. Recently I ran into an issue where I had to play with FileSystemWatcher class. This good ol’ friend of mine is pretty nifty and except few tricks, you can go ahead with a straight forward implementation.
Here is a sample form code that I wrote :
1: namespace Skynet.FSWatch 2: { 3: using System; 4: using System.IO; 5: using System.Text; 6: using System.Windows.Forms; 7: 8: public partial class MainForm : Form 9: { 10: delegate void SetTextCallback(string value); 11: 12: public MainForm() 13: { 14: InitializeComponent(); 15: } 16: 17: private void WatchButton_Click(object sender, EventArgs e) 18: { 19: FileSystemWatcher watcher = new FileSystemWatcher(this.FolderPathTextBox.Text); 20: watcher.EnableRaisingEvents = true; 21: watcher.IncludeSubdirectories = true; 22: watcher.InternalBufferSize = 16384; 23: 24: watcher.Created += new FileSystemEventHandler(FSChangeHandler); 25: watcher.Deleted += new FileSystemEventHandler(FSChangeHandler); 26: watcher.Changed += new FileSystemEventHandler(FSChangeHandler); 27: watcher.Renamed += new RenamedEventHandler(watcher_Renamed); 28: watcher.Error += new ErrorEventHandler(watcher_Error); 29: } 30: 31: void watcher_Renamed(object sender, RenamedEventArgs e) 32: { 33: StringBuilder stringBuilder = new StringBuilder(); 34: stringBuilder.Append("ChangeType : " + e.ChangeType + Environment.NewLine); 35: stringBuilder.Append("OldFullPath : " + e.OldFullPath + Environment.NewLine); 36: stringBuilder.Append("FullPath : " + e.FullPath + Environment.NewLine); 37: 38: stringBuilder.Append("OldName : " + e.OldName + Environment.NewLine); 39: stringBuilder.Append("Name : " + e.Name + Environment.NewLine); 40: 41: this.SetText(stringBuilder.ToString()); 42: } 43: 44: void watcher_Error(object sender, ErrorEventArgs e) 45: { 46: SetText(e.GetException().Message + Environment.NewLine + e.GetException().StackTrace); 47: } 48: 49: void FSChangeHandler(object sender, FileSystemEventArgs e) 50: { 51: StringBuilder stringBuilder = new StringBuilder(); 52: stringBuilder.Append("ChangeType : " + e.ChangeType + Environment.NewLine); 53: stringBuilder.Append("FullPath : " + e.FullPath + Environment.NewLine); 54: stringBuilder.Append("Name : " + e.Name + Environment.NewLine); 55: 56: this.SetText(stringBuilder.ToString()); 57: } 58: 59: private void SetText(string text) 60: { 61: if (this.OutputTextBox.InvokeRequired) 62: { 63: SetTextCallback setTextDelegate = new SetTextCallback(SetText); 64: this.Invoke(setTextDelegate, new object[] { text }); 65: } 66: else 67: { 68: this.OutputTextBox.Text += text; 69: } 70: } 71: 72: private void FolderPathTextBox_DoubleClick(object sender, EventArgs e) 73: { 74: FolderBrowserDialog dialog = GetFolderBrowseDialog("Select a Folder"); 75: DialogResult result = dialog.ShowDialog(); 76: if (result == DialogResult.OK) 77: { 78: this.FolderPathTextBox.Text = dialog.SelectedPath; 79: } 80: } 81: 82: /// <summary> 83: /// Get Browse Folder Dialog 84: /// </summary> 85: /// <returns>Returns FolderBrowse Dialog</returns> 86: public static FolderBrowserDialog GetFolderBrowseDialog( 87: string description) 88: { 89: FolderBrowserDialog dialog = new FolderBrowserDialog(); 90: dialog.Description = description; 91: dialog.ShowNewFolderButton = true; 92: return dialog; 93: } 94: } 95: } 96: