Вопрос по mono, c#, filesystemwatcher, macos – 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

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

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

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

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