我的想法是在两个时间点T1
和T2
之间跟踪文件系统中的特定文件。这里的重点在于将文件视为文件系统上的唯一实体。可以改变数据和属性但仍然保持其独特身份的那个。
最终目标是通过捕获和记录文件的数据哈希和创建/修改属性来确定文件的数据是否(不情愿地)在T1
和T2
之间发生了变化在T1
,并将它们与T2
处的等价物进行比较。如果所有属性都未更改但散列未验证,则可以说存在问题。在所有其他情况下,我们可能愿意说改变的散列是修改的结果,并且未更改的散列和未更改的修改 - 属性根本不对文件(数据)进行更改。
现在,有几种方法可以引用文件和相应的缺点:
我的想法是在T1
检索该特定文件的fileId以跟踪T2
处的文件,即使它已更改其位置,因此无需将其视为新文件。
我知道pywin提供的两种方法。 win32file.GetFileInformationByHandle()
和win32file.GetFileInformationByHandleEx()
,但它们显然仅限于特定的文件系统,打破了跨平台兼容性,并且偏离了跟踪文件的通用方法。
我的问题很简单:是否还有其他想法/理论来跟踪文件,理想情况是平台/ FS?
欢迎任何有头脑风暴的思想食物!
答案 0 :(得分:4)
一般来说这并不可行,因为文件身份的概念是一种幻觉(类似于身体认同的幻觉,但这不是一个哲学论坛)。
您无法使用文件内容跟踪身份,因为内容已更改。
您无法跟踪附加到该文件的任何其他属性,因为许多文件编辑器将通过删除旧文件并创建新文件来保存更改。
版本控制系统以三种方式处理此问题:
(CVS)不要跟踪移动操作。
(Subversion)手动跟踪移动操作。
(Git)使用启发式操作将操作标记为基于文件内容更改的“移动”操作(例如,如果新文件与现有文件的差异小于50%,则标记为作为副本)。
像inode数字这样的东西不稳定且不值得信任。在这里,您可以看到使用Vim编辑文件将更改inode编号,我们可以使用stat -f %i
来检查:
$ touch file.txt $ stat -f %i file.txt 4828200 $ vim file.txt ...make changes to file.txt... $ stat -f %i file.txt 4828218