In a previous example, I showed how to use the FileSystemWatcher
class to monitor a directory. But there are times when we need to monitor multiple directories and if any changes are available, invoke a given method.
We can do that by using the following method. First create a class. We’ll call this class Watcher
.
1: public class Watcher
2: {
3: public string Directory { get; set; }
4: public string Filter { get; set; } 6:
5:
6: private Delegate _changeMethod;
7:
8: public Delegate ChangeMethod
9: {
10: get { return _changeMethod; }
11: set { _changeMethod = value; }
12: }
13:
14: FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
15:
16: public Watcher(string directory, string filter, Delegate invokeMethod)
17: {
18: this._changeMethod = invokeMethod;
19: this.Directory = directory;
20: this.Filter = filter;
21: }
22:
23: public void StartWatch()
24: {
25: fileSystemWatcher.Filter = this.Filter;
26: fileSystemWatcher.Path = this.Directory;
27: fileSystemWatcher.EnableRaisingEvents = true;
28:
29: fileSystemWatcher.Changed +=
new FileSystemEventHandler(fileSystemWatcher_Changed);
30: }
31:
32: void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
33: {
34: if (_changeMethod != null)
35: {
36: _changeMethod.DynamicInvoke(sender, e);
37: }
38: }
39: }
And we can use it to monitor multiple directories as shown below (for this example, I have used a console application and I am only considering the change event):
1: class Program
2: {
3: delegate void invokeMethodDelegate(object sender, FileSystemEventArgs e);
4:
5: static void Main(string[] args)
6: {
7: invokeMethodDelegate mymethod = new invokeMethodDelegate(InvokeMethod);
8: Watcher w1 = new Watcher(@"C:\Directory1", "*.*", mymethod);
9: w1.StartWatch();
10:
11: Watcher w2 = new Watcher(@"D:\Directory2", "*.*", mymethod);
12: w2.StartWatch();
13:
14: string zRetVal = Console.ReadLine();
15: }
16:
17: static void InvokeMethod(object sender, FileSystemEventArgs e)
18: {
19: Console.WriteLine("Change in file {0}", e.FullPath);
20: }
21: }