带过滤器的 FileSystemWatcher 不监视已删除的地图

FileSystemWatcher with filter doesn't watch deleted maps

我创建了一个 filesystemwatcher 来监视某个目录并监视具有测试扩展名的文件。

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = somepath;
watcher.Filter = "*.Tests";
// Hooked changed, deleted and created events
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;

当在监视目录或其子目录中创建、删除或更改具有测试扩展名的文件时,事件会正确触发。

问题是,如果我在 watched 目录中删除一个地图,其中包含带有 Tests 扩展名的文件。那时没有事件被触发,尽管许多带有测试扩展名的文件被删除。

有什么办法可以做到这一点吗?

好吧,问题是当文件夹被删除时文件实际上并没有被删除 - 所以 FileSystemWatcher 无法过滤这些文件。你只能得到一个删除 - 对于目录。如果您确实需要在实践中处理此问题,则必须使用单独的 FileSystemWatcher 来监视删除整个目录。

当然,这也取决于删除是如何完成的——很多应用程序仍然在做 "delete all the files, then the directory"。您通常可以很容易地分辨出区别 - 如果删除包含大量文件的目录需要时间,它会先删除文件。这些对您的情况会正常工作 - 但其他人会失败。

如果您只需要一个变通方法,大多数应用程序会在无法通过一次删除删除目录时切换到按文件删除 - 例如,当目录中有锁定文件时。