FileSystemWatcher文件位于子目录中

我正在尝试通知如果创建,复制或移动到我正在观看的目录中的文件。 我只希望收到有关文件的通知,而不是目录。

这是我目前的一些代码:

_watcher.NotifyFilter = NotifyFilters.FileName; _watcher.Created += new FileSystemEventHandler(file_created); _watcher.Changed += new FileSystemEventHandler(file_created); _watcher.Renamed += new RenamedEventHandler(file_created); _watcher.IncludeSubdirectories = true; _watcher.EnableRaisingEvents = true; 

问题是,如果我移动一个包含文件的目录,我就不会收到该文件的任何事件。

如何通知我所有添加的文件(无论如何)到监视目录或它的子目录?

Incase我没有解释得足够好……我有WatchedDirectoryDirectory1Directory1包含Hello.txt 。 如果我将Directory1移动到WatchedDirectory ,我希望收到Hello.txt的通知。

编辑:我应该注意我的操作系统是Windows 8.我确实收到了复制/粘贴事件的通知,但没有移动事件(拖放到文件夹中)。

也许这种解决方法可以派上用场(但我会小心性能,因为它涉及递归):

 private static void file_created(object sender, FileSystemEventArgs e) { if (e.ChangeType == WatcherChangeTypes.Created) { if (Directory.Exists(e.FullPath)) { foreach (string file in Directory.GetFiles(e.FullPath)) { var eventArgs = new FileSystemEventArgs( WatcherChangeTypes.Created, Path.GetDirectoryName(file), Path.GetFileName(file)); file_created(sender, eventArgs); } } else { Console.WriteLine("{0} created.",e.FullPath); } } } 

NotifyFilters添加一些filter。 目前你只是在观察文件名的变化。 这与您的Changed和Renamed处理程序一起应该完成这项工作。

 _watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite 

这似乎只适用于复制/粘贴操作。 对于剪切/粘贴操作(或拖放), NotifyFilters.DirectoryName添加以下通知filter: NotifyFilters.DirectoryName

编辑

我已经玩了很多,实际上只有一个顶级文件夹的通知进来。如果你想到它,这是有道理的。 由于创建了更改类型,因此您确定其中的所有文件和文件夹都是新的,您可以处理它们。

所以,@ AlexFilipovici的方法是唯一可行的方法,尽管我将结果(文件夹)排入队列并在工作线程(或任务,无论如何)上处理它。 您不希望在FSWatcher事件处理程序中花费太多时间,尤其是在文件以高速率进入时。

复制和移动文件夹

操作系统和FileSystemWatcher对象将剪切和粘贴操作或移动操作解释为文件夹及其内容的重命名操作。 如果将包含文件的文件夹剪切并粘贴到正在监视的文件夹中,则FileSystemWatcher对象仅将该文件夹报告为新文件夹,而不报告其内容,因为它们基本上仅重命名。

参考: MSDN