【问题标题】:FileSystemWatcher under mono - watching subdirs单声道监视子目录下的 FileSystemWatcher
【发布时间】:2013-05-13 09:41:26
【问题描述】:

我有问题。我在FileSystemWatcher 上编写了一个包装器,可以检测 root 文件夹及其所有子文件夹中的更改。没什么特别的:

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)。

一年前已经报告了不正确路径的问题(看起来已经解决了),但我的单声道来自去年 12 月(MonoDevelop 在参考部分说它是版本 4.0.0.0,我只能说关于分布)和错误仍然存​​在...... 看: https://bugzilla.xamarin.com/show_bug.cgi?id=5747

有什么想法吗?我真的很好奇是否有一种解决方法不需要编写自己的观察程序来重复轮询文件系统或为 root 下的每个文件夹启动单独的观察程序...

提前致谢!

【问题讨论】:

  • 可能,这会有所帮助:[does-net-filesystemwatcher-work-with-mono-on-mac-os][1] [1]: stackoverflow.com/questions/5727652/…
  • 看到这个话题,很遗憾我在那里找不到任何帮助...不过还是谢谢!
  • 如果 5747 的错误修复没有解决您的情况,您只需在 bugzilla.xamarin.com 中创建一个新的不同错误

标签: c# macos mono filesystemwatcher


【解决方案1】:

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

据我所知,implementation of KEventWatcher 在创建观察者时不会订阅子目录。我认为它订阅子目录的唯一时间是当它检测到它们被添加到 PostEvent 中时。即使它确实订阅了创建时的所有子目录,它也可能不是一个很好的解决方案。底层的 kevent 机制要求每个子目录都有一个打开的文件描述符,这最终可能会成为非常多的文件描述符。

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

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

【讨论】:

  • 没有深入了解您描述的细节,我决定编写自己的“观察者” - 我只是轮询文件系统并手动检测更改的项目 - 有点开销,但好吧......最我从将 Windows 程序移植到 MacOS 中学到的重要一件事——学习 Objective C 或聘请能做到的人。当您发现另一个未实现/不工作的功能时,它将为您省去麻烦,例如检测网络状态、电源变化等
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多