3

我有 2 个硬盘卷(一个是另一个的备份映像),我想比较这些卷并列出所有修改过的文件,以便用户可以选择他/她想要回滚的那些。

目前我正在遍历新卷并将每个文件的时间戳与旧卷的文件进行比较(如果它们在旧卷中)。显然,这是一种错误的做法。这既耗时又错误!

有没有一种有效的方法来做到这一点?

编辑:
- 我正在使用 FindFirstFile 并且喜欢递归卷,并收集每个文件的信息(不是很慢,只需几分钟)。
- 我正在使用卷影复制进行备份。
- 备份卷是远程的,所以我无法持续监控实际卷。

4

5 回答 5

2

这部分取决于这两卷是如何复制的。如果从文件系统的角度来看它们是“真正的”副本(例如卷影副本或其他块级副本),您可以针对 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 查询中可能已过时,并且您必须处理删除后重新创建的案例、重命名案例等)。

因此,了解您对环境的控制程度非常重要。

于 2010-08-29T00:54:00.460 回答
1

与其等到更改发生后,然后扫描整个磁盘以查找(通常是少数)已更改的文件,不如ReadDirectoryChangesW设置一个程序用于在更改发生时监视更改。这将让您以最少的麻烦和麻烦构建文件列表。

于 2010-08-28T19:34:55.150 回答
0

假设您没有将新卷上的每个文件与快照中的每个文件进行比较,这是您可以做到的唯一方法。您如何在不查看所有文件的情况下找到哪些文件没有被修改?

于 2010-08-28T18:04:31.120 回答
0

我不是 Windows 程序员。但是你不应该有 stat 函数来检索文件的修改时间。根据 mod 时间对文件进行排序。修改时间大于您上次备份时间的文件是您感兴趣的文件。

您第一次可以遍历备份卷以从您感兴趣的集合中计算出最大 mod 时间和创建时间。我假设感兴趣的目录不会在备份卷中被修改。

于 2010-08-28T18:54:59.873 回答
0

如果不知道您在这里尝试做什么的更多细节,很难说。但是,关于我认为您要达到的目标的一些提示:

  • 如果您只关心 NTFS 卷,我建议您查看 USN/更改日志 API。它们自 2000 年以来一直存在。这样,在初始库存之后,您只能查看从那时起的变化。这是一个很好的起点,虽然这里有一篇非常古老的文章:http: //www.microsoft.com/msj/0999/journal/journal.aspx
  • 此外,利用 USN API,您可以省略哈希步骤,只自己记录日志中的信息(当/如果您查看所述 API 时,这将变得更加清晰)
  • 第一次通过比较驱动器的内容,使用 SHA-1 或 MD5 等哈希。
  • 将哈希值和其他此类信息存储在某种数据库中。例如,SQLite3。请注意,这本身可能会占用大量空间。快速查看包含 40k+ 个文件的音频文件夹会产生约 750 兆的 MD5 信息。
于 2010-08-28T20:10:47.100 回答