我们需要比较两个(或更多)文本文件的内容,以确定是否需要创建备份。如果它们不同,我们会创建一个新备份。
我目前使用每个文件的CRC值来检查差异,但我想知道是否有更有效或更优雅的方法来检测文件之间的差异。
//Use madZIP to calculate the CRC fior this file
GetUncompressedFileInfo(Filename_1, Size_1, NewCRC);
//Use madZIP to calculate the CRC fior this file
GetUncompressedFileInfo(Filename_2, Size_2, OldCRC);
//if ThisFileHash = ExistingFileHash then
if (OldCRC <> NewCRC) then
CreateABackup;
问候,彼得。
答案 0 :(得分:7)
CRC不是检测文件更改的安全方法 - 加密哈希(如MD5或SHA1)要好得多。
另一种方法(如构建系统使用的方法)是比较文件日期。如果文件比备份更新,则需要新备份。
答案 1 :(得分:2)
CRC可能更准确,效率更高。但是你需要检查内容吗?
我假设您正在检查CRC以查看是否已进行修改并重新备份更新的文件。在这种情况下,FileAge()就可以了。
答案 2 :(得分:1)
您还应该考虑使用增量备份。
我为SynProject开源工具发布了一些优化的文件版本控制功能。 ProjectVersioning单元中的TVersions
类允许在zip容器内进行二进制差异存储。
我们专有但速度快于SynLZ algorithm用于存储增量差异。它在实践中非常有效。
参见例如TVersions.FillStrings
方法,用于检索要更新的文件列表。
请注意,您可能会发现一小时的差异,具体取决于当前的夏令时。以下是我们允许按日期比较的方式:
function SameFileDateWindows(FileDate1,FileDate2: integer): boolean;
// we allow an exact one Hour round (NTFS bug on summer time zone change)
begin
dec(FileDate1,FileDate2);
result := (FileDate1=0) or (FileDate1=1 shl 11) or (FileDate1=-(1 shl 11));
end;
我们不会在此处阅读文件内容。出于备份目的,仅依靠文件日期将文件标记为要进行比较就足够了。然后对文件的两个版本执行差异diff。如果文件内容相同,则仅存储日期差异。
恕我直言,你不应该使用专有的madzip容器,而是标准的容器,如.zip。有几个,包括我们在SynProject或我们的ORM中使用的版本。它比MadZip快,并且解压缩是优化的asm。请参阅SynZip单元进行低级压缩,使用简单的.zip阅读器和编写器,以及SynZipFiles中的更多进化类(用于SynProject)。对于纯粹的Delphi版本,比如madzip版本,检查PasZip单元,它比madzip快(但是PasZip不会用Unicode Delphi编译,而SynZip会编译)。
答案 3 :(得分:0)
实际上,确保文件标识的最佳做法是存储内容哈希值(例如:CRC-32或任何其他哈希函数)和 文件大小< / strong>即可。这样做可以提高可靠性。 RE:存储 - 不需要计算已知多次更改的内容的哈希值。