我需要跟踪文件的更改,但我想不出办法

I need to track changes to files, but I cannot think of a way

我有一个想法,我正在努力。我有一个 windows 迷你过滤器驱动程序,我正在尝试创建它,它将虚拟化某些进程对文件的更改。我通过捕获写入并将写入发送到虚拟化位置中的文件来实现这一点。这是问题所在: 如果进程尝试读取,它需要对文件中尚未写入的部分进行未更改的读取,但它需要从已写入的部分中进行更改的读取。如何有效地跟踪已更改的文件段?我似乎记得有一种方法可以使用位掩码来映射文件段,但我可能记错了。无论如何,我们将不胜感激。

两种解决方案:

  1. 直接将原文件复制到虚拟化存储中,只使用这个文件。对于小文件,它可能是最好和最快的解决方案。 举个例子,假设任何小于 65536 字节的文件都将被完全复制——在任何情况下都使用 2 的幂。 如果文件增长超过限制,请参阅解决方案 2。

  2. 对于大文件,将被覆盖的段保存在虚拟化存储中,需要时根据当前文件位置使用。最简单的方法是将它分成 65536 字节的块......你通过将文件的位置向右移动 16 来获得块号,并且块内的位置是通过仅屏蔽低 16 位来获得的。

示例:

file_position = 165 232 360
chunk_number = file_position >> 16 (== 2 521)
chunk_pos = file_position & 0xFFFF (== 16 104)

因此,您的虚拟化存储成为一个目录,存储命名为普通的块(例如,块#2521 = 2521.chunk)。

当写入发生时,您开始将原始数据复制到虚拟化存储中的新块,然后您允许应用程序写入。

显然,如果文件在增长,只需​​添加仅存在于虚拟化存储中的块。


它并不完美 - 您可以使用增量块而不是完整块来节省磁盘 space - 但这是一个很好的开始,可以在以后进行优化。 此外,添加版本非常容易,并跟踪:

  • 各种使用该文件的应用程序(保留多个虚拟化存储),
  • 连续启动(运行#1 修改文件开头,运行#2 修改文件结尾,您保留两个虚拟化并且可以轻松“恢复”上次启动)。