Как сравнить 2 тома и список измененных файлов? - PullRequest
3 голосов
/ 28 августа 2010

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

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

Есть ли эффективный способ сделать это?

РЕДАКТИРОВАТЬ:- Я использую FindFirstFile и люблю повторять объем и собирать информацию о каждом файле (не очень медленно, всего несколько минут).- Я использую Volume Shadow Copy для резервного копирования.- Резервный том удаленный, поэтому я не могу постоянно следить за фактическим объемом.

Ответы [ 5 ]

2 голосов
/ 29 августа 2010

Частично это зависит от того, как дублируются два тома;если они являются «истинными» копиями с точки зрения файловой системы (например, теневые копии или другие копии на уровне блоков), вы можете сделать несколько хитрых мелочей в отношении USN, - это общая технология, которую другие предлагают вам изучить,Возможно, вы захотите взглянуть на API, например FSCTL_READ_FILE_USN_DATA , например.Этот API позволит вам сравнивать две разные копии файла (опять же, предполагая, что они один и тот же файл с одинаковым номером ссылки на файл из резервных копий на уровне блоков).Если вы хотите быть в основном не имеющим состояния, этот и подобные API-интерфейсы очень вам здесь помогут.Мой алгоритм выглядел бы примерно так:

foreach( file in backup_volume ) {
    file_still_exists = try_open_by_id( modified_volume )
    if (file_still_exists) {
        usn_result = compare_usn_values_of_files( file, file_in_modified_volume )
        if (usn_result == equal_to) {
           // file hasn't changed at all
        } else {
           // file has changed (somehow)
        }
    } else {
        // file was deleted (possibly deleted and recreated)
    }
}
// we still don't know about files new in modified_volume

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

Если тома не являются копиями на уровне блоков друг друга, тогда будет очень трудно сравнивать номера USN и идентификаторы файлов, если не невозможно.Вместо этого вы можете использовать имя файла, что будет трудно, если не невозможно, без открытия каждого файла (время может быть изменено приложениями, размеры и время могут быть устаревшими в запросах findfirst / next, и выприходится обрабатывать удаленные, а затем воссозданные дела, переименовывать дела и т. д.).

Поэтому очень важно знать, насколько вы контролируете окружение.

1 голос
/ 28 августа 2010

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

0 голосов
/ 29 августа 2010

Не зная больше деталей о том, что вы пытаетесь сделать здесь, трудно сказать.Тем не менее, некоторые советы о том, что я думаю вы пытаетесь достичь:

  • Если вас интересуют только тома NTFS, я предлагаю заглянуть в USN / API журнала изменений,Они существуют примерно с 2000 года. Таким образом, после первоначальной инвентаризации вы можете только смотреть на изменения с этого момента.Хорошая отправная точка для этого, хотя здесь есть очень старая статья: http://www.microsoft.com/msj/0999/journal/journal.aspx
  • Кроме того, используя USN API, вы можете пропустить шаг хеширования и просто записать информацию из журнала самостоятельно(это станет более понятным, когда / если вы посмотрите на указанные API)
  • При первом сравнении содержимого накопителя используйте хеш, такой как SHA-1 или MD5.
  • Хеши хранилища идругая такая информация в какой-то базе данных.Например, SQLite3.Обратите внимание, что это может занимать огромное количество самого пространства.Быстрый просмотр моей аудио-папки с 40k + файлами даст ~ 750 мегабайт информации MD5.
0 голосов
/ 28 августа 2010

Я не программист Windows. Однако у вас не должно быть функции stat для получения измененного времени файла. Сортировка файлов по времени мода. Файлы, у которых время мода больше, чем у вас в последний раз, являются вашими интересами.

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

0 голосов
/ 28 августа 2010

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

...