2008-09-14 7 views
27

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

ответ

28

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

Inotify подсистема ядра Linux , которая предоставляет файл системы EVENT уведомления.

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

+0

Да, я смог заставить это работать для этого. Его немного странно, с блокировкой read() - но, по крайней мере, есть нулевая латентность (скорее, опрос!). – 2008-09-15 06:13:16

1

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

0

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

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

17

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

0

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

+0

ни одна из этих библиотек не выполняет то, что требует OP - это библиотеки для создания даже управляемого программного обеспечения - например, для неблокирующих сетевых IOS. – 2015-07-10 21:56:37

1

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^