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