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

StackOverflow https://stackoverflow.com/questions/61253

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Несколько вкусностей для Windows fellows:

Другие советы

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

Там есть API событий файловой системы как у Леопарда.

Я не думаю, что у самого POSIX есть для этого возможности.Самое близкое к кроссплатформенному, что я видел, это СЕМЬЯ, который, кажется, работает для 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 ( событие) или либев кажется, это то, что вам нужно, хотя я ими и не пользовался.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top