我还没有找到一个备份(同步)程序来完成我想要的工作,所以我正在考虑编写自己的程序。
我现在所执行的操作如下:它遍历源中的数据以及每个已设置其存档位或目标中不存在的文件,将其复制到目标,覆盖可能存在的文件。完成后,它会检查目标中的所有文件(如果它存在于源中),如果不存在,则删除它。
问题在于,如果我移动或重命名一个大文件夹,它首先会被复制到目的地,即使它原则上已存在,只是有一个不同的路径。然后,之后删除已经存在的文件夹。
除了不必要的复制外,我经常遇到空间问题,因为我的备份驱动器不足以容纳原始数据两次。
有没有办法以编程方式识别此类移动/重命名的文件或文件夹,即通过NTFS ID或媒体上的物理位置或其他内容?这个问题有解决方案吗?
我不关心编程语言,但是对使用Python,C ++,C#,Java或Prolog执行此操作的提示表示赞赏。
答案 0 :(得分:6)
您熟悉对象ID吗?这可能是您正在寻找的内容:http://msdn.microsoft.com/en-us/library/aa363997.aspx
您可能还想使用文件ID。您可以通过拨打FILE_ID_BOTH_DIR_INFO
或GetFileInformationByHandleEx
的FileId
和nFileIndexLow
字段来nFileIndexHigh
{{1}}字段中的{{1}}字段获取此字段致电BY_HANDLE_FILE_INFORMATION
。
虽然它需要您重新设计系统,但NTFS有一个名为GetFileInformationByHandle
的功能,专为此情况而设计。它会跟踪每个已更改的文件,即使在重新启动时也是如此。当你的程序运行时,它会在它停止时读取更改日志。对于已删除的每个文件,请删除备份中的该文件。对于重命名的每个文件,请在备份中重命名该文件。对于创建或更改的每个文件,将该文件复制到备份中。现在,您可以简单地遍历您实际需要注意的文件列表,而不必同时遍历两个目录树。
答案 1 :(得分:0)
不确定可能对您有帮助的NTFS细节,但您不考虑比较文件哈希值吗?并且为了不多次计算哈希,您可以首先比较文件大小。