C# mono-watching子目录下的FileSystemWatcher

C# mono-watching子目录下的FileSystemWatcher,c#,macos,mono,filesystemwatcher,C#,Macos,Mono,Filesystemwatcher,我有个问题。我在FileSystemWatcher上编写了一个包装器,用于检测根文件夹及其所有子文件夹中的更改。没什么特别的: FileSystemWatcher watcher = new FileSystemWatcher (); watcher.Path = this.Root; watcher.IncludeSubdirectories = true; watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastA

我有个问题。我在
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\u to\u root/some/more/subdirs/some.file时,获取的路径只是path\u to\u root/some.file)

一年前就已经报告了未保护路径的问题(看起来已经解决了),但我的mono是去年12月发布的(MonoDevelop在参考资料部分说它是4.0.0.0版,这是我所能说的关于发行版的全部内容),而且bug仍然存在。。。 见:

有什么想法吗?我真的很好奇,是否有一种解决方法不需要编写自己的监视程序来反复轮询文件系统,或者为根目录下的每个文件夹启动单独的监视程序


提前谢谢

据我所知,这在操作系统X上的Mono中根本不起作用。我上周遇到了它,找不到任何错误报告,所以我在这里报告了它:

就我所知,创建观察者时订阅子目录并没有任何作用。我认为它订阅子目录的唯一时间是在PostEvent中检测到它们被添加时。即使它在创建时订阅了所有子目录,这也可能不是一个好的解决方案。底层的kevent机制要求每个子目录都有一个打开的文件描述符,这可能会导致大量的文件描述符

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


我不敢说,看来您最好的选择是您建议的解决方案之一—手动扫描更改或为每个目录创建一个FileSystemWatcher。

可能是,这会有帮助:[net FileSystemWatcher在mac os上与mono一起工作吗][1][1]:看到这个主题,很遗憾,我在那里找不到任何帮助。。。不过,谢谢!如果5747的错误修复没有修复您的场景,您只需在中创建一个新的不同的错误,而不必深入您描述的细节,我决定编写自己的“观察者”-我只需轮询文件系统并手动检测更改的项-有点开销,但很好。。。我从将Windows程序移植到MacOS上学到的最重要的一件事是——学习Objective C或者雇佣一个可以的人。当您发现另一个未实现/不工作的功能(例如检测网络状态、电源变化等)时,它将为您省去麻烦