Python 随时间跟踪文件

Python 随时间跟踪文件,python,file,file-io,filesystems,Python,File,File Io,Filesystems,我的想法是在两个时间点,T1和T2之间跟踪文件系统中的特定文件。这里的重点在于将文件视为文件系统中唯一的实体。一种可以改变数据和属性但仍然保持其唯一身份的方法 最终目标是通过在T1处捕获并记录文件的数据散列和创建/修改属性,并将其与T2处的等价物进行比较,来确定文件的数据是否(不情愿地)在T1和T2之间发生了更改。如果所有属性都未更改,但哈希值未验证,则可以说存在问题。在所有其他情况下,我们可能愿意说更改的哈希是修改的结果,而未更改的哈希和未更改的修改属性是文件(数据)根本没有更改的结果 现在,

我的想法是在两个时间点,
T1
T2
之间跟踪文件系统中的特定文件。这里的重点在于将文件视为文件系统中唯一的实体。一种可以改变数据和属性但仍然保持其唯一身份的方法

最终目标是通过在
T1
处捕获并记录文件的数据散列和创建/修改属性,并将其与
T2
处的等价物进行比较,来确定文件的数据是否(不情愿地)在
T1
T2
之间发生了更改。如果所有属性都未更改,但哈希值未验证,则可以说存在问题。在所有其他情况下,我们可能愿意说更改的哈希是修改的结果,而未更改的哈希和未更改的修改属性是文件(数据)根本没有更改的结果

现在,有几种引用文件的方法以及相应的缺点:

  • 文件路径:但是,如果文件移动到其他位置,此方法将失败
  • 文件数据的数据散列:允许找到文件,或者更确切地说是指向磁盘上文件数据的指针,即使指针已移动到其他目录,但数据无法更改或者此方法也失败
我的想法是在
T1
处检索特定文件的fileId,以跟踪
T2
处的文件,即使该文件已更改其位置,因此不需要将其视为新文件

我知道pywin提供的两种方法
win32file.GetFileInformationByHandle()
win32file.GetFileInformationByHandleEx()
,但它们显然局限于特定的文件系统,破坏了跨平台兼容性,偏离了跟踪文件的通用方法

我的问题很简单:是否有其他想法/理论来跟踪文件,最好是跨平台/FSs


欢迎大家集思广益

一般来说,这是不可行的,因为文件身份的概念是一种幻觉(类似于物理身份的幻觉,但这不是一个哲学论坛)

  • 无法使用文件内容跟踪标识,因为内容会更改

  • 您无法通过附加到文件的任何其他属性进行跟踪,因为许多文件编辑器将通过删除旧文件并创建新文件来保存更改

  • 版本控制系统通过三种方式处理此问题:

  • (CV)不跟踪移动操作

  • (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 $touch file.txt $stat-f%i file.txt 4828200 $vim file.txt …对file.txt进行更改。。。 $stat-f%i file.txt 4828218
    一般来说,这是不可行的,因为文件身份的概念是一种幻觉(类似于物理身份的幻觉,但这不是一个哲学论坛)

  • 无法使用文件内容跟踪标识,因为内容会更改

  • 您无法通过附加到文件的任何其他属性进行跟踪,因为许多文件编辑器将通过删除旧文件并创建新文件来保存更改

  • 版本控制系统通过三种方式处理此问题:

  • (CV)不跟踪移动操作

  • (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 $touch file.txt $stat-f%i file.txt 4828200 $vim file.txt …对file.txt进行更改。。。 $stat-f%i file.txt 4828218
    对文件内容进行MD5散列怎么样。在不同的时间实例上检查md5散列?在linux文件系统上(
    ext
    我猜),您有inode,如果我没有弄错的话,这些inode在文件移动中会保持不变。然而,在windows上。。。我不确定。这是个好问题。您可能需要编写一些特定于平台的代码,只需涵盖所有基础。@SidharthShah:他涵盖了这一点。如果文件在T1和T2之间移动和修改,那么您就完蛋了。散列将有所不同;您将无法再次找到该文件。您可能必须执行一些内核级别的操作,挂接到移动文件和修改文件的任何内容,并保留日志somewhere@Mark:太好了,听起来像是NTFS/FAT(?)上的文件索引:
    GetFileInformationByHandleEx
    允许您检索
    nFileIndexLow
    nFileIndexHigh
    ,该文件与单个封闭系统上的
    VolumeSerialNumber
    组合唯一标识文件。跟踪功能非常适合消除手动任务,即验证位于
    T1
    的位置a中的文件是否与位于
    T1
    的位置B中的文件相同,这将是一种不切实际的方法,尤其是在较大的文件树上。对文件内容进行MD5哈希处理如何。在不同的时间实例上检查md5散列?在linux文件系统上(
    ext
    我猜),您有inode,如果我没有弄错的话,这些inode在文件移动中会保持不变。然而,在windows上。。。我不确定。这是个好问题。您可能需要编写一些特定于平台的代码,并且只需覆盖所有基础。@Si