Уведомление об изменении файловой системы на уровне файла в Mac OS X

StackOverflow https://stackoverflow.com/questions/1772209

Вопрос

Я хочу, чтобы мой код уведомлялся при изменении любого файла в данном каталоге (прямо или косвенно).Под «модифицированным» я подразумеваю, что хочу, чтобы мой код уведомлялся всякий раз, когда содержимое файла изменяется, переименовывается или удаляется;или если добавлен новый файл.Для моего приложения могут быть тысячи файлов.

Я смотрел как FSEvents, но в Обзоре технологий, в частности, говорится:

Важным моментом является то, что детализация уведомлений находится на уровне каталога.Он сообщает вам только о том, что что-то в каталоге изменилось, но не сообщает, что именно изменилось.

Там также говорится:

API событий файловой системы также не предназначен для определения момента изменения конкретного файла.Для таких целей более подходит механизм kqueues.

Однако, чтобы использовать kqueue для данного файла, необходимо открыть файл и получить дескриптор файла.Непрактично управлять тысячами файловых дескрипторов (и в любом случае это, вероятно, превысит максимально допустимое количество открытых файловых дескрипторов).

Любопытно, что под Windows я могу использовать ReadDirectoryChangesW() функция, и она делает именно то, что я хочу.

Так как же можно делать то, что я хочу, в Mac OS X?Или, спросив по-другому:как бы написать эквивалент ReadDirectoryChangesW() для Mac OS X в пользовательском пространстве (и делать это очень эффективно)?

Это было полезно?

Решение

Я сам не пробовал, но похоже, что FSEvents может предоставлять уведомления на уровне файлов, начиная с версии 10.7 (Lion).От описание FSEventStreamCreateFlags:

kFSEventStreamCreateFlagFileEvents

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

Доступно в OS X v10.7 и более поздних версиях.

Другие советы

РЕДАКТИРОВАТЬ:Не проверено, но Константин указывает ниже, что этот пример кода устарел по состоянию на 2012 год.

Я не верю, что существует конкретный API для того, что вы ищете.Apple предоставляет пример кода для решения аналогичной проблемы под названием наблюдатель.Это не то, что вы ищете, но это лучшее, что вы можете сделать на данный момент.Вам придется делать снимки каталога и повторно сканировать его, когда вы обнаружите, что что-то изменилось.Конечно, лучше всего проверять время модификации, если вы можете доверять времени модификации.

Вероятно, вы правы в том, что попытка зарегистрироваться для неограниченного числа kочередей, скорее всего, окажется неосуществимой.

Ближайшая утилита (насколько я знаю), которая соответствует вашим потребностям в Mac OS X, — это fslogger.См. ссылку для описания, dmg и исходного кода:OSXBook — fslogger

Возможно, вы захотите проверить man fs_usage, хотя это не относится к конкретному каталогу и требует привилегий root.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top