Как сравнить 2 тома и список измененных файлов?

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

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

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

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

5 ответов

Решение

Частично это зависит от того, как дублируются два тома; если они являются "истинными" копиями с точки зрения файловой системы (например, теневые копии или другие копии на уровне блоков), вы можете сделать несколько хитрых мелочей в отношении 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, и вы обрабатывать удаленные, а затем воссозданные дела, переименовывать дела и т. д.).

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

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

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

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

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

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

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

Другие вопросы по тегам