Обнаружить изменения в каталоге - PullRequest
1 голос
/ 15 декабря 2011

Мне нужно отслеживать папку и ее подкаталоги для любых манипуляций с файлами (добавить / удалить / переименовать). Я читал о FileSystemWatcher, но я хотел бы отслеживать изменения между каждым запуском программы или когда пользователь нажимает кнопку «проверить наличие изменений» (FSW кажется более ориентированным на обнаружение во время выполнения). Моей первой мыслью было перебрать все (под) каталоги и хэшировать каждый файл. Затем объедините все хеши (которые были заказаны) и хешируйте их. Когда я хочу проверить изменения, я повторяю процесс и проверяю, совпадают ли хэши.

Это эффективный способ сделать это? Кроме того, как только я обнаружил изменение, как мне узнать, какой файл был добавлен, удален или переименован как можно быстрее?

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

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Очевидно, вам нужно сделать «снимки» дерева каталогов и сравнить их по мере необходимости.Что именно входит в снимки, будет зависеть от ваших требований.Имейте в виду, что:

  • Вам необходимо хранить имена файлов, чтобы обнаруживать «новые» и «удаленные» файлы
  • Размеры файлов и время последнего изменения - хороший и дешевый индикаторчто файл изменился или не изменился, но не предоставляет гарантии
  • Хэширование содержимого файлов может быть чрезмерно дорогим, если файлы могут быть большими, но это единственный способ узнать, что они изменились с почти-совершенная степень точности (помните, что хэши также могут сталкиваться, поэтому, если вы хотите получить 100% -ную математическую достоверность, этого тоже недостаточно)
2 голосов
/ 15 декабря 2011

Мы справляемся с этим, сохраняя все найденные файлы в базе данных вместе с их временем последнего изменения.

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

Существует также возможность обрабатывать удаленные файлы, пометив все файлы в базе данных как ToBeDeleteed перед передачей и очистив его, если файл был найден.Затем, в конце процесса, мы можем просто удалить все записи, помеченные как ToBeDeleted.

...