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

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

Ответы [ 7 ]

28 голосов
/ 14 сентября 2008

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

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

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

18 голосов
/ 14 сентября 2008

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

2 голосов
/ 14 сентября 2008
1 голос
/ 20 декабря 2013

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

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

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

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

1 голос
/ 14 сентября 2008

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

0 голосов
/ 14 апреля 2009

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

0 голосов
/ 14 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...