Мониторинг каталога в Какао / Какао Touch - PullRequest
8 голосов
/ 11 октября 2011

Я пытаюсь найти способ отслеживать содержимое каталога на предмет изменений. Я пробовал два подхода.

  1. Используйте kqueue для мониторинга каталога
  2. Используйте GCD для мониторинга каталога

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ определить, какой файл изменился. Я пытаюсь отслеживать каталог с потенциально тысячами файлов в нем, и я не хочу вызывать stat для каждого из них, чтобы узнать, какие из них изменились. Я также не хочу устанавливать отдельный источник отправки для каждого файла в этом каталоге. Возможно ли это в настоящее время?

Примечание: я задокументировал свои файлы мониторинга экспериментов с kqueue и GCD

1 Ответ

5 голосов
/ 23 октября 2011

Мой совет - просто откусить пулю и выполнить сканирование каталогов в другом потоке, даже если вы говорите о тысячах файлов.Но если вы настаиваете, вот ответ:

Нет способа сделать это, не закатывая рукава и не погружаясь в ядро.

Первый вариант - использовать среду FSEvents, которая рассылает уведомления при создании, редактировании или удалении файла (а также о том, что делать с атрибутами).Обзор здесь , и кто-то написал обертку Objective C вокруг API, хотя я не пробовал.Но в обзоре не упоминается часть о событиях, связанных с изменениями file , только каталоги (как с kqueue).В итоге я использовал код из здесь вместе с файлом заголовка здесь , чтобы скомпилировать свой собственный регистратор, который я мог бы использовать для получения событий на уровне отдельных файлов.Вам нужно написать код в своем приложении, чтобы запустить регистратор в фоновом режиме и отслеживать его.

В качестве альтернативы, посмотрите на команду " fs_usage ", которая постоянно отслеживает всеактивность файловой системы (и я имею в виду all ).Это уже с Дарвином, так что вам не нужно его компилировать самостоятельно.Вы можете использовать kqueue для прослушивания изменений каталога, одновременно отслеживая вывод « fs_usage ».Если вы получили уведомление от kqueue о том, что каталог изменился, вы можете посмотреть на вывод fs_usage, посмотреть, в какие файлы были записаны файлы, и проверить имена файлов в соответствии с каталогом, который был изменен.fs_usage - пожарный шланг, поэтому будьте готовы использовать некоторые опции вместе с Grep, чтобы приручить его.

Чтобы сделать все более увлекательным, и вашему регистратору FSEvents, и fs_usage требуется root-доступ, поэтому вам нужно будет получить авторизацию от пользователя, прежде чем вы сможете использовать их в своем приложении OS X (см. Руководство по программированию служб авторизации для получения информации о том, как это сделать).

Если все это звучит ужасно сложно, то это потому, что это так.Но, по крайней мере, вам не нужно было искать трудный путь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...