Я хочу, чтобы мой код был уведомлен, когда любой файл (напрямую или косвенно) в данном каталоге изменяется. Под «модифицированным» я имею в виду, что хочу, чтобы мой код уведомлялся всякий раз, когда содержимое файла изменяется, переименовывается или удаляется; или если добавляется новый файл. Для моего приложения могут быть тысячи файлов.
Я смотрел как FSEvents, но в Обзоре технологии частично говорится:
Важно отметить, что детализация уведомлений находится на уровне каталога. Он говорит вам только, что что-то в каталоге изменилось, но не говорит вам, что именно изменилось.
Там также говорится:
API событий файловой системы также не предназначен для обнаружения изменений в конкретном файле. Для таких целей больше подходит механизм kqueues.
Однако, чтобы использовать kqueue для данного файла, нужно открыть файл, чтобы получить дескриптор файла. Нецелесообразно управлять тысячами файловых дескрипторов (и, вероятно, в любом случае будет превышено максимально допустимое количество открытых файловых дескрипторов).
Любопытно, что под Windows я могу использовать функцию ReadDirectoryChangesW()
, и она делает именно то, что мне нужно.
Итак, как можно делать то, что я хочу, под Mac OS X? Или, если задать другой вопрос: как можно написать эквивалент ReadDirectoryChangesW()
для Mac OS X в пользовательском пространстве (и сделать это очень эффективно)?