views:

698

answers:

5

Whats the best way to monitor multiple folders (not subdirectories) using FileSystemWatcher in C#?

+5  A: 

I don't think FSW supports monitoring multiple folders, so just instantiate one per folder you want to monitor. You can point the event handlers at the same methods, though, which should end up working like I think you want.

Factor Mystic
A: 

Can you simply use multiple instances of the FileSystemWatcher, one for each directory?

Charlie Salts
+3  A: 

The easiest way is to create multiple instances of the FileSystemWatcher object.

http://www.c-sharpcorner.com/UploadFile/mokhtarb2005/FSWatcherMB12052005063103AM/FSWatcherMB.aspx

You'll have to make sure the you handle events between the two folders correctly:

Although some common occurances, such as copying or moving a file, do not correspond directly to an event, these occurances do cause events to be raised. When you copy a file, the system raises a Created event in the directory to which the file was copied but does not raise any events in the original directory. When you move a file, the server raises two events: a Deleted event in the source directory, followed by a Created event in the target directory.

For example, you create two instances of FileSystemWatcher. FileSystemWatcher1 is set to watch "C:\My Documents", and FileSystemWatcher2 is set to watch "C:\Your Documents". Now, if you copy a file from "My Documents" into "Your Documents", a Created event will be raised by FileSystemWatcher2, but no event is raised for FileSystemWatcher1. Unlike copying, moving a file or directory would raise two events. From the previous example, if you moved a file from "My Documents" to "Your Documents", a Created event would be raised by FileSystemWatcher2 and a Deleted event would be raised by FileSystemWatcher

Link to FileSystemEventArgs

Kevin
So can I use the same method to handle for both the directories, say as in example below: fileWatcher[index].Created += new FileSystemEventHandler(OnCreated);In the above case how would OnCreated() know the index value (or rather the directory that needs to be monitored)? Thanks.
Bi
@Bi If I understand what you are asking (long day). The director info will be passed into the the OnCreated function as part of the FileSystemEventArs parameter. http://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs.aspx
Kevin
Perfect - Thanks!
Bi
A: 

Out of the box, FileSystemWatcher only supports monitoring a single parent directory. To monitor multiple sibling directories, you would need to create multiple instances of FileSystemWatcher.

You can try cheating this behavior, however, by taking advantage of FileSystemWatcher's ability to include subdirectories. You can create an NTFS junction point (aka symbolic link) as a subdirectory from the directory you are watching. Mark Russinovich of Sysinternals fame has a utility called Junction to simplify creation and management of symlinks.

Note that you can only create symlinks to directories on your local machine.

Tim Trout
A: 

You would have to instantiate multiple instances of the FileSystemWatcher object. Though you can bind the Events to the same method and use the sender object to determine which FileSystemWatcher triggered the event.

        var fsw1 = new FileSystemWatcher();
        var fsw2 = new FileSystemWatcher();
        FileSystemEventHandler fsw_changed = delegate(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} - {1}", (sender as FileSystemWatcher).Path, e.ChangeType);
        };
        fsw1.Changed += fsw_changed;
        fsw2.Changed += fsw_changed;
BAH