单监视子目录下的文件系统监视程序

本文关键字:文件 系统监视 程序 子目录 监视 单监视 | 更新日期: 2023-09-27 18:13:12

我有一个问题。我在FileSystemWatcher上编写了一个包装器,用于检测文件夹及其所有子文件夹中的更改。没有任何花哨:

FileSystemWatcher watcher = new FileSystemWatcher ();
watcher.Path = this.Root;
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.DirectoryName | NotifyFilters.FileName;
watcher.Changed += new FileSystemEventHandler (watcher_Changed);
watcher.Deleted += new FileSystemEventHandler (watcher_Deleted);
watcher.Created += new FileSystemEventHandler (watcher_Created);
watcher.Renamed += new RenamedEventHandler (watcher_Renamed);
watcher.EnableRaisingEvents = true;

而在。net中,在Windows下,它像一个魅力。但是当我将代码移植到mono并在OSX下运行代码时,它只能在根文件夹中正常工作。

我注意到的问题:

  • 在监视程序启动时,在根目录下已经存在的文件夹内的操作不会引发事件

  • 路径我通过EventArgs.FullPath属性是不正确的(当我复制一个文件到path_to_root/some/more/subdirs/some。文件,我得到的路径只是path_to_root/some.file)

不正确路径的问题已经在一年前报告过了(看起来已经解决了),但我的mono来自去年12月(MonoDevelop在参考资料部分说它是4.0.0.0版本,这是我所能说的关于发行版),bug仍然存在…看到的:https://bugzilla.xamarin.com/show_bug.cgi?id=5747

任何想法?我真的很好奇是否有一种解决方法,不需要编写自己的监视程序来重复轮询文件系统,或者为

下的每个文件夹启动单独的监视程序。

提前感谢!

单监视子目录下的文件系统监视程序

据我所知,这在OS x上的Mono中根本不起作用。我上周遇到了它,找不到任何错误报告,所以我在这里报告:https://bugzilla.xamarin.com/show_bug.cgi?id=16259

就我所能遵循的KEventWatcher的实现而言,它在创建watcher时不做任何事情来订阅子目录。我认为它订阅子目录的唯一时间是当它检测到它们被添加到PostEvent中时。即使它在创建时订阅了所有子目录,它也可能不是一个很好的解决方案。底层的kevent机制需要每个子目录都有一个打开的文件描述符,这可能会导致大量的文件描述符。

Mono确实有其他的FileSystemWatcher实现,但是我相信实现的选择是在编译时被烘焙到Mono运行时的。有一种缓慢而低效的默认监视程序,它可以在所有平台上工作,只需每秒钟扫描一次整个目录树,但是只有在没有特定于平台的实现可用时才选择它。

我恐怕得说,看起来你最好的选择是你建议的变通方法——手动扫描更改或为每个目录创建一个FileSystemWatcher。