Тема говорит сама за себя - обычно простой и кросс-платформенный способ - разумно опросить. Но у каждой ОС есть средства для уведомления без опроса. Возможно ли это разумно кросс-платформенным способом? (Меня действительно интересуют только Windows и Linux, но я использую Mac, поэтому я подумал, что posix может помочь?)
Как получать уведомления об изменении файла/каталога в C/C++, в идеале с использованием POSIX
Ответы (7)
Пользователи Linux могут использовать inotify.
inotify — это подсистема ядра Linux, которая обеспечивает уведомление о событиях файловой системы.
Некоторые плюсы для Windows-соратников:
- Уведомление об изменении файла в MSDN
- Статья "При изменении папок"
- Уведомление файловой системы об изменении
В библиотеке Qt есть класс QFileSystemWatcher, который обеспечивает межплатформенные уведомления при изменении файла. . Даже если вы не используете Qt, поскольку исходный код доступен, вы можете взглянуть на него как на образец для своей собственной реализации. Qt имеет отдельные реализации для Windows, Linux и Mac.
Я не думаю, что у самого POSIX есть для этого средства. Самый близкий к кросс-платформе, который я видел, это FAM, который, кажется, работает для Linux. , BSD и Irix, но я не представляю, насколько просто было бы портировать его на Windows и MacOS.
На самом деле я построил эту систему раньше для использования в коммерческой базе кода C++ - пока вам не нужны все странные вещи под солнцем, системы Windows и POSIX имеют много совпадений, которые вы можете абстрагировать.
POSIX: используйте inotify — это целая система, буквально построенная для этой работы.
Windows: используйте «события изменений». Вам нужно создать больше клея и отчетов самостоятельно (все необходимые API-интерфейсы доступны, просто нет универсальной покупки, которую дает вам inotify).
Общие вещи, которые вы можете обнаружить в своем «потоке уведомлений» для пересылки событий:
1) В основном любая инвазивная операция boost::filesystem поддерживает, с (возможным) исключением изменения разрешений. Это такие вещи, как перемещение, создание, удаление, копирование папок и файлов.
2) Чтение и запись в файлы (особенно запись). Имейте в виду, что если вы используете асинхронный ввод-вывод, уведомления могут отображаться не по порядку.
3) Когда поступает новый том, например, кто-то подключает флэш-накопитель.
inotify особенно дает вам безумный уровень детального контроля, в отличие от Windows. С помощью inotify вы можете буквально отслеживать все, что делает файловая система, почти в реальном времени, если вы действительно этого хотите. Я знаю, что № 3 возможен с обоими без опроса, но имейте в виду, что может быть очень сложно заставить его работать правильно - в любой системе.
Я считаю, что в OS X теперь есть соответствующие хуки/обратные вызовы, потому что они были необходимы для индексации Spotlight.
В Linux у вас будет дополнительная проблема, связанная с тем, что обычно используется несколько файловых систем. Если вам нужна функциональность только для ограниченного количества файлов/каталогов, я бы попытался активно искать модификации через регулярные промежутки времени.
libevent или libev кажется тем, что вам нужно, хотя я их не использовал.