单声道下的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;
在.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,我可以说有关分发)并且仍然存在错误…请参阅: https : //bugzilla.xamarin.com/show_bug.cgi?id = 5774
有任何想法吗? 我真的很好奇,如果有一个解决方法,不需要编写自己的观察者,重复轮询文件系统或为根目录下的每个文件夹启动单独的观察者…
提前致谢!
据我所知,这根本不适用于OS X上的Mono。上周我遇到过它并且找不到任何错误报告,所以我在这里报告: https : //bugzilla.xamarin.com/show_bug的CGI?ID = 16259
至于我可以遵循KEventWatcher的实现 ,它在创建观察器时没有做任何事情来订阅子目录。 我认为它订阅子目录的唯一时间是它检测到它们是在PostEvent中添加的。 即使它在创建时订阅了所有子目录,也可能不是一个很好的解决方案。 底层的kevent机制需要为每个子目录打开一个文件描述符,这可能最终成为很多文件描述符。
Mono确实有FileSystemWatcher的其他实现,但我相信在编译时,实现的选择被融入Mono运行时。 有一个缓慢且低效的默认观察程序可以在所有平台上运行,只需每隔一秒左右扫描整个目录树,但只有在没有可用的特定于平台的实现时才会选择它。
我不敢说,看起来你最好的选择是你建议的解决方法 – 手动扫描更改或为每个目录创建FileSystemWatcher。