单声道下的FileSystemWatcher - 观察子目录

woj*_*uch 5 c# macos mono filesystemwatcher

我有个问题.我编写了一个包装器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;
Run Code Online (Sandbox Code Playgroud)

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

我现在注意到的问题:

  • 在观察者启动时,在根目录下已存在的文件夹内的操作不会引发事件

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

一年前已经报道了unproper路径的问题(看起来已经解决了)但我的单声道来自去年12月(MonoDevelop在参考资料部分说它是版本4.0.0.0,我可以说有关分发)并且bug仍然存在...请参阅:https: //bugzilla.xamarin.com/show_bug.cgi?id = 5747

有任何想法吗?我真的很好奇,如果有一个解决方法,不需要编写自己的观察者,重复轮询文件系统或为目录下的每个文件夹启动单独的观察者...

提前致谢!

Wee*_*ble 5

据我所知,这根本不适用于OS X上的Mono.我上周遇到过它并且找不到任何错误报告,所以我在这里报告:https://bugzilla.xamarin.com/show_bug的CGI?ID = 16259

至于我可以遵循KEventWatcher实现,它在创建观察器时没有做任何事情来订阅子目录.我认为它订阅子目录的唯一时间是它检测到它们是在PostEvent中添加的.即使它在创建时订阅了所有子目录,也可能不是一个很好的解决方案.底层的kevent机制需要为每个子目录打开一个文件描述符,最终可能会成为很多文件描述符.

Mono确实有FileSystemWatcher的其他实现,但我相信在编译时,实现的选择会被融入Mono运行时.还有的是,通过简单地扫描整个目录树每秒左右在所有平台上工作的缓慢和低效默认守望者,但如果没有可用的特定于平台的实现它只是选择.

手动或每目录中创建一个FileSystemWatcher的扫描更改 - 我不敢说,它看起来像你最好的选择是要么你建议的解决方法.