Подтвердить что ты не робот

Как получить уведомление об изменении файла/каталога в C/С++, в идеале используя POSIX

Субъект говорит все - обычно легкий и кросс-платформенный способ - опросить, разумно. Но у каждой ОС есть средства для уведомления без опроса. Возможно ли это на достаточно кросс-платформенном пути? (Я действительно забочусь только о Windows и Linux, но я использую mac, поэтому я думал, что posix может помочь?)

4b9b3361

Ответ 1

Пользователи Linux могут использовать inotify

inotify - подсистема ядра Linux который обеспечивает событие файловой системы уведомление.

Некоторые лакомства для стипендиатов Windows:

Ответ 2

В библиотеке Qt есть класс QFileSystemWatcher, который предоставляет кросс-платформенные уведомления при изменении файла. Даже если вы не используете Qt, потому что источник доступен, вы можете посмотреть на него как образец для своей собственной реализации. Qt имеет отдельные реализации для Windows, Linux и Mac.

Ответ 4

Я не думаю, что у POSIX есть возможности для этого. Самый близкий к кросс-платформенному, который я видел, FAM, который, похоже, работает для Linux, BSD и Irix, m не так легко было бы переносить его на Windows и MacOS.

Ответ 5

Я действительно создал эту систему раньше для использования в коммерческой базе кода на С++, если вам не нужна всякая странная вещь под солнцем, системы Windows и POSIX имеют много перекрытий, которые вы можете абстрагировать.

POSIX: используйте inotify - это целая система, буквально построенная для этой работы
Windows: используйте "change events". Вам нужно собрать больше клея и сообщить о себе (все доступные вам API-интерфейсы доступны, а только 1-стоп-шоп-inotify дает вам).

Общими вещами, которые вы можете обнаружить в своем "потоке уведомлений" для событий пересылки, являются:
1) В принципе любая инвазивная операция boost:: filesystem поддерживает, с (возможным) исключением для изменения разрешений. Это такие вещи, как перемещение, создание, удаление, копирование папок и файлов.
2) Чтение и запись в файлы (особенно записи). Имейте в виду, что если вы используете асинхронный ввод-вывод, уведомления могут отображаться вне порядка.
3) Когда приходит новый том, например, кто-то подключает флешку.

inotify особенно дает вам безумный уровень мелкозернистого управления, Windows меньше. С помощью inotify вы можете буквально контролировать все, что делает файловая система в почти реальном времени, если вы действительно этого хотите. Я знаю, что # 3 возможно с обоими без опроса, но имейте в виду, что это может быть очень сложно заставить его работать правильно - в любой системе.

Ответ 6

Я считаю, что OS X теперь имеет соответствующие перехваты/обратные вызовы, потому что они необходимы для индексации Spotlight.

В Linux у вас появятся дополнительные проблемы, которые обычно используются в нескольких файловых системах. Если вам нужна функциональность только для ограниченного количества файлов/каталогов, я бы попытался активно искать изменения через равные промежутки времени.

Ответ 7

libevent или libev кажется, что вы хотите, хотя я их не использовал.