File 唯一标识NTFS中的文件/文件夹,即使在移动/重命名之后

File 唯一标识NTFS中的文件/文件夹,即使在移动/重命名之后,file,synchronization,directory,backup,ntfs,File,Synchronization,Directory,Backup,Ntfs,我还没有找到一个备份(同步)程序,它可以满足我的需要,所以我正在考虑编写自己的备份(同步)程序 我现在做的是:它遍历源中的数据,对于每个设置了存档位或目标中不存在的文件,将其复制到目标,覆盖可能存在的文件。完成后,它会检查目标中是否存在源中的所有文件,如果不存在,则将其删除 问题是,如果我移动或重命名一个大文件夹,它会首先被复制到目标位置,尽管原则上它已经存在,只是路径不同而已。然后,已经存在的文件夹随后被删除 除了不必要的复制之外,我经常遇到空间问题,因为我的备份驱动器不够大,无法保存两次原始

我还没有找到一个备份(同步)程序,它可以满足我的需要,所以我正在考虑编写自己的备份(同步)程序

我现在做的是:它遍历源中的数据,对于每个设置了存档位或目标中不存在的文件,将其复制到目标,覆盖可能存在的文件。完成后,它会检查目标中是否存在源中的所有文件,如果不存在,则将其删除

问题是,如果我移动或重命名一个大文件夹,它会首先被复制到目标位置,尽管原则上它已经存在,只是路径不同而已。然后,已经存在的文件夹随后被删除

除了不必要的复制之外,我经常遇到空间问题,因为我的备份驱动器不够大,无法保存两次原始数据

是否有一种方法可以通过编程方式识别此类移动/重命名的文件或文件夹,即通过NTFS ID或介质上的物理位置或其他方式?有解决这个问题的办法吗


我不关心编程语言,但用Python、C++、C语言、java或Prolog来做这件事的提示被理解。

< P>不确定NTFS的细节,这可能对你有帮助,但是你没有考虑比较文件哈希吗?为了避免多次计算散列,您可以首先比较文件大小

您熟悉对象ID吗?这可能是您正在寻找的:

您可能还希望使用文件ID。您可以通过调用获取的
FileId
字段或调用获取的
nFileIndexLow
nFileIndexHigh
字段获取此信息


虽然需要重新设计系统,但NTFS有一个名为a的功能,就是为这种情况而设计的。它跟踪每一个被更改的文件,甚至在重新启动时也是如此。当您的程序运行时,它会在任何时候停止时读取更改日志。对于每个已删除的文件,请在备份中删除该文件。对于每个重命名的文件,请在备份中重命名该文件。对于创建或更改的每个文件,将该文件复制到备份中。现在,您不必同时遍历两个目录树,只需遍历实际上需要注意的文件列表即可。

这是个不错的主意。整个文件的散列计算时间太长,但我想我可以取前100个字节左右的大小+散列。。。只要想想支票的实际顺序就可以了。。。首先散列备份中的所有内容,将其存储在一个巨大的映射中,然后遍历源文件中的文件,如果在映射中找到,则在备份中适当移动它,否则复制。。。无论我做什么,都需要一个复杂的算法才能正确感谢您的想法……忘记散列,这是一种方法。@Gabe是文件ID,只是打开文件的一个属性,例如,或者是否有某种ID应用于任何文件(如果未启用NTFS日志记录,也是如此)?是否可以通过powershell或s.th获取此ID。相似的?(我贴了一个)这里有一个在序言中做这件事的提示:不要这只是一种我非常熟悉的语言。信不信由你。。。它相对容易使用,我无法想象有人会说Prolog“容易”。有时玩起来很有趣,就像德州仪器一样,计算器也很有趣,但它并不适合这些任务。