Вопрос по filesystemwatcher, macos, mono, c# – FileSystemWatcher под моно - просмотр подкаталогов

5

У меня проблема. Я написал обертку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, это работает как шарм. Но когда я перенес код на моно и запустил код под OSX, он работает правильно только в корневой папке.

Проблемы, которые я уже заметил:

События не генерируются для операций внутри папок, уже существующих в корневом каталоге, во время запуска наблюдателя.

Пути, через которые я прохожуEventArgs.FullPath свойство неверно (когда я копирую файл в path_to_root / some / more / subdirs / some.file, путь, который я получаю, просто path_to_root / some.file).

О проблеме с ненадлежащими путями уже сообщалось год назад (и похоже, что она была решена), но мой моно появился в декабре прошлого года (MonoDevelop говорит, что в разделе «Ссылки» это версия 4.0.0.0, это все, что я могу сказать о дистрибутиве). ) и ошибки все еще есть ... Смотрите:https://bugzilla.xamarin.com/show_bug.cgi?id=5747

Есть идеи? Мне действительно любопытно, есть ли обходной путь, не требующий написания собственного наблюдателя, который повторно опрашивает файловую систему, или запуска отдельного наблюдателя для каждой папки вкорень...

Заранее спасибо!

если исправление для 5747 не 'Чтобы исправить ваш сценарий, вы должны просто создать новую ошибку вbugzilla.xamarin.com knocte
Может быть, это может помочь: [do-net-filesystemwatcher-work-with-mono-on-mac-os] [1] [1]:stackoverflow.com/questions/5727652/... Igor Minakov
Видел эту тему, к сожалению, я могуТам не найти никакой помощи ... Спасибо, хотя! wojtuch

Ваш Ответ

1   ответ
5

Насколько я могу судить, это просто не работает в Mono на OS X. Я столкнулся с ним на прошлой неделе и не смог найти никакого сообщения об ошибке, поэтому я сообщил об этом здесь:https://bugzilla.xamarin.com/show_bug.cgi?id=16259

Насколько я могу следоватьреализация KEventWatcherэто нене делайте ничего, чтобы подписаться на подкаталоги при создании наблюдателя. Я думаю, что единственный раз, когда он подписывается на подкаталоги, это когда он обнаруживает их добавление в PostEvent. Даже если он подписался на все подкаталоги при создании, это может быть не лучшим решением. Базовому механизму kevent потребуется открытый дескриптор файла для каждого подкаталога, который может оказаться очень большим количеством файловых дескрипторов.

Mono имеет другие реализации FileSystemWatcher, но я считаю, что выбор реализации запекается во время выполнения Mono, когдаскомпилировано. Существует медленный и неэффективный наблюдатель по умолчанию, который работает на всех платформах, просто просматривая все дерево каталогов каждую секунду или около того, но он выбирается только в том случае, если нетДоступна реализация для конкретной платформы.

боюсь сказать, похоже, что лучшая ставка для вас - это либо обходные пути, которые вы предлагаете, - сканирование изменений вручную или создание FileSystemWatcher для каждого каталога.

не вдаваясь так глубоко в детали, которые вы описали, я решил написать свою "сторож» - Я просто опрашиваю файловую систему и выявляю измененные элементы вручную - немного накладных расходов, но хорошо ... самое важное, что я узнал при переносе программы Windows на MacOS, - изучать Objective C или нанимать кого-нибудь, кто может. Это избавит вас от головной боли, когда вы обнаружите другие не реализованные / не работающие функции, например, обнаружение состояния сети, изменения питания и т. д. wojtuch

Похожие вопросы