2013-05-13 30 views
5

我遇到问题。我用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路径问题已经被报道一年前(和看起来好像是解决了),但我的单来自于去年十二月(MonoDevelop的说,在参考部分是4.0.0.0版本,它是所有我可以说的分布)和错误仍然存​​在... 请参阅: https://bugzilla.xamarin.com/show_bug.cgi?id=5747

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

在此先感谢!

+0

可能,这可以帮助:不净FileSystemWatcher的工作与 - 单上-MAC-OS] [1] [1]:http://stackoverflow.com/问题/ 5727652/do-net-filesystemwatcher-work-with-mono-on-mac-os – 2013-05-13 10:55:08

+0

看到这个话题,不幸的是我找不到任何帮助...但谢谢! – wojtuch 2013-05-13 10:58:28

+0

如果5747修正错误的未解决您的情况,您应该简单地建立在http://bugzilla.xamarin.com – knocte 2013-08-09 12:22:21

回答

5

据我所知,这根本不单在OS X上工作,我在上周遇到过,但没有找到任何错误报告,所以我在这里报道的那样:https://bugzilla.xamarin.com/show_bug.cgi?id=16259

据因为我可以按照implementation of KEventWatcher,当创建观察器时,它不会执行任何操作来订阅子目录。我认为它只订阅子目录的时间是当它检测到它们被添加到PostEvent中时。即使它确实订阅了所有创建的子目录,但它可能不是一个好的解决方案。底层的kevent机制需要为每个子目录打开一个文件描述符,这可能最终成为大量的文件描述符。

Mono确实有FileSystemWatcher的其他实现,但是我相信当它被编译时,实现的选择会被纳入Mono运行时。有一个缓慢而低效的默认观察器,可以在所有平台上工作,只需每隔一秒左右扫描整个目录树,但只有在没有可用的平台特定实现时才能选择。

我不敢说,看起来最好的选择是你建议的解决办法之一 - 手动扫描更改或为每个目录创建一个FileSystemWatcher。

+0

一个新的不同的错误没有得到如此之深成您所描述的细节,我决定写我自己的“守望者” - 我只是轮询文件系统和手动检测更改的项目 - 一个位的开销,但好... 我从移植的Windows程序的MacOS学到的最重要的事情 - 学习Objective C或雇用人谁可以。当您发现另一个未实施/不工作的功能时,它将为您节省头痛。检测网络状态,电源变化等 – wojtuch 2013-11-20 11:34:19