2011-01-31 2 views
0

Я работаю над проектом, для которого потребуется приложение, которое следит за списком каталогов, который пользователь указывает на изменения. Кроме того, я хотел бы предоставить пользователям возможность запуска приложения как услуги или на индивидуальной основе. Поскольку пользователи могут запускать его на индивидуальной основе, я не думаю, что прослушивание какого-либо события операционной системы, вызванного добавлением или удалением файлов (если такие события существуют) будет достаточным. Я подумал о том, чтобы вычислить контрольную сумму для самой глубокой папки, а затем собрать ее. Затем я мог бы сравнить эти контрольные суммы при последующих сканированиях, чтобы попытаться определить, где произошли изменения. Будет ли это подходящим решением; если бы не то, что было бы лучшим способом сделать это эффективным образом?Мониторинг папок для изменений

Кроме того, я не совсем уверен, что бы отметить это так, если у вас есть какие-либо рекомендации, дайте мне знать, и я буду как они, как я считаю нужным.

EDIT: я нужен этот метод, чтобы работать на Windows, OS X и Linux идеально

ответ

1

Там существует несколько методов для отслеживания изменений.

Простейшим является сканирование каталога по таймеру и сравнение временных меток и размеров файлов. Однако это ресурсоемкий процесс, и некоторые изменения могут быть пропущены (например, если файл дважды менялся между проверками, первое изменение будет пропущено).

Далее можно использовать функцию Windows API FindFirstChangeNotification (у нее есть свои ограничения).

И самым сложным и надежным методом является использование драйвера фильтра файловой системы. В Windows может использоваться наш CallbackFilter. На MacOS X можно создать драйвер фильтра, но я не знаю о каком-либо готовом к использованию продукте, подобном CallbackFilter. В Linux можно использовать inotify.

0

man kqueue

(по крайней мере, это, как я хотел бы сделать это на моем наиболее часто целевой ОС - но вы должны указать это в вашем посте)

2

На Mac OSX вы можете использовать FSEvent, который похож на интерфейс inotify на Linux.

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