Обнаружение изменений в файловой системе с момента последнего сканирования - PullRequest
3 голосов
/ 30 октября 2008

Программы, которые индексируют файловые системы, похоже, знают, какие части изменились с момента их последнего индекса, и только повторно сканируют эту часть. Как я могу определить, где файловая система / файлы изменились со времени моего последнего индекса. Мне все равно, на каком языке вы отвечаете, но я думаю c и windows.

Примером такой программы является Sequoia View, которая генерирует древовидную карту вашего жесткого диска.

Ответы [ 6 ]

6 голосов
/ 30 октября 2008

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

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

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

Вам может пригодиться исходный код для fswatch .

4 голосов
/ 21 июня 2009

У вас есть 2 проблемы для решения здесь.

Первое, если вы хотите отслеживать динамические изменения (сделанные во время работы вашей программы). В этом случае вам нужно использовать Windows API ReadDirectoryChangesW. Есть много примеров того, как его использовать. (Осторожно ... некоторые примеры не очень хороши. Этот вызов API МОЖЕТ и будет возвращать более одного события для каждого вызова, и вам необходимо внимательно прочитать интерфейс, понять, как он работает, и обработать ВСЕ, что возвращается.

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

В этом случае наиболее эффективным методом является одновременное чтение содержимого папки по имени файла и накопительный хэш. Более того, вы также хотите получить атрибуты (используя что-то вроде GetFileAttributesEx) и включить их в хеш. (обязательно исключите папки "." и ".." - иначе результаты будут вводить в заблуждение.)

Причина этого заключается в том, что вы хотите отследить изменения в файле по его размеру, датам и т. Д. Однако вы, вероятно, не хотите включать время LastAccessed.

Любая большая хеширующая функция должна подойти. В результате получается одно большое число (хеш) для каждой папки.

Затем, когда вы делаете еще один проход, вы заново вычисляете хеш и сравниваете с сохраненным хешем последнее известное состояние этой папки. Если хэши не совпадают, вам нужно подробно просмотреть папку.

По сути, этот подход говорит вам (быстро), что здесь есть кое-что, что вам нужно рассмотреть более подробно, и то, как вы это делаете, зависит от того, чего вы пытаетесь достичь.

Преимущество этого в том, что вы смотрите не на содержимое каждого файла в папке, а на некоторые метаданные, которые дают вам достаточно указаний. Таким образом, обработка выполняется во много тысяч раз быстрее.

4 голосов
/ 30 октября 2008

Если вы программировали на управляемом языке .Net, попробуйте класс FileSystemWatcher .

Из MSDN:

Используйте FileSystemWatcher для наблюдения за изменения в указанном каталоге. Вы можно наблюдать за изменениями в файлах и подкаталоги указанных каталог. Вы можете создать компонент смотреть файлы на локальном компьютере, сетевой диск или удаленный компьютер.

Чтобы отслеживать изменения во всех файлах, установите свойство Filter для пустой строки ("") или используйте подстановочные знаки (". "). к смотреть конкретный файл, установить фильтр свойство к имени файла. За Например, следить за изменениями в файл MyDoc.txt, установить фильтр свойство "MyDoc.txt". Вы также можете следить за изменениями в определенном типе файл. Например, следить за изменения в текстовых файлах, установите фильтр свойство "* .txt".

3 голосов
/ 30 октября 2008
1 голос
/ 06 ноября 2009

В Linux (и любой другой Unix-подобной ОС, я полагаю) можно генерировать хеш-значение для файла / папки, чтобы представить его состояние в данный момент времени. Позже, просто восстановите хеш и сравните это со старым значением. Это оказалось очень эффективным для некоторых проектов, над которыми я работал!

Подробности здесь: http://vpalos.com/169/recursive-filedirectory-change-detection/

Чувствителен к любым изменениям (даже при изменении времени доступа к файлу).

1 голос
/ 30 октября 2008

FindFirstChangeNotification

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