2008-10-30 1 views
3

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

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

ответ

6

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

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

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

Возможно, вы найдете source code для fswatch.

4

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

Из MSDN:

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

Чтобы следить за изменениями во всех файлах, установите Свойство Filter в пустую строку («») или использовать групповые символы («.»). В просмотрите определенный файл, установите свойство Filter в имя файла. Для примера для просмотра изменений в файле MyDoc.txt в файле установите для параметра «Фильтр » значение «MyDoc.txt». Вы также можете смотреть фотографии с разрешением . Например, чтобы просмотреть изменения в текстовых файлах, установите для свойства Filter значение «* .txt».

4

У вас есть 2 проблемы.

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

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

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

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

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

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

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

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

1

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

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

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

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

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