我有 2 个硬盘卷(一个是另一个的备份映像),我想比较这些卷并列出所有修改过的文件,以便用户可以选择他/她想要回滚的那些。
目前我正在遍历新卷并将每个文件的时间戳与旧卷的文件进行比较(如果它们在旧卷中)。显然,这是一种错误的做法。这既耗时又错误!
有没有一种有效的方法来做到这一点?
编辑:
- 我正在使用 FindFirstFile 并且喜欢递归卷,并收集每个文件的信息(不是很慢,只需几分钟)。
- 我正在使用卷影复制进行备份。
- 备份卷是远程的,所以我无法持续监控实际卷。
这部分取决于这两卷是如何复制的。如果从文件系统的角度来看它们是“真正的”副本(例如卷影副本或其他块级副本),您可以针对 USN 做一些棘手的小事情,这是其他人建议您研究的一般技术. 例如,您可能想查看类似FSCTL_READ_FILE_USN_DATA的 API 。该 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 编号和文件 ID 将非常困难,如果不是不可能的话。相反,您很可能会按文件名进行操作,如果不打开每个文件(时间可以通过应用程序修改,大小和时间在 findfirst/next 查询中可能已过时,并且您必须处理删除后重新创建的案例、重命名案例等)。
因此,了解您对环境的控制程度非常重要。
与其等到更改发生后,然后扫描整个磁盘以查找(通常是少数)已更改的文件,不如ReadDirectoryChangesW
设置一个程序用于在更改发生时监视更改。这将让您以最少的麻烦和麻烦构建文件列表。
假设您没有将新卷上的每个文件与快照中的每个文件进行比较,这是您可以做到的唯一方法。您如何在不查看所有文件的情况下找到哪些文件没有被修改?
我不是 Windows 程序员。但是你不应该有 stat 函数来检索文件的修改时间。根据 mod 时间对文件进行排序。修改时间大于您上次备份时间的文件是您感兴趣的文件。
您第一次可以遍历备份卷以从您感兴趣的集合中计算出最大 mod 时间和创建时间。我假设感兴趣的目录不会在备份卷中被修改。
如果不知道您在这里尝试做什么的更多细节,很难说。但是,关于我认为您要达到的目标的一些提示: