我们需要比较两个(或多个)文本文件的内容,以确定是否需要创建备份。如果它们不同,我们将创建一个新的备份。
我目前使用每个文件的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;
敬你,皮特。
CRC不是检测文件更改的安全方法——加密哈希(如MD5或SHA1)要好得多。
另一种方法(类似于构建系统所使用的方法)是比较文件日期。如果文件比备份更新,则需要新的备份。
CRC可能更准确、更高效。但是,您需要检查内容吗?
我假设你正在检查CRC,看看是否进行了修改,并重新备份更新的文件。在这种情况下,FileAge()就可以了。
您还应该考虑使用增量备份。
我已经为SynProject开源工具发布了一些优化的文件版本控制功能。ProjectVersioning单元中的TVersions
类允许在zip容器中存储二进制diff。
我们的专有但比zip更快的SynLZ算法用于存储增量差异。它在实践中效果很好。
例如,参见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。如果文件内容相同,则只存储日期差异。
IMHO你不应该使用专有的madzip容器,而是一个标准的容器,比如.zip。有几个,包括我们在SynProject或ORM中使用的版本。它比MadZip更快,解压缩是在优化的asm中进行的。请参阅SynZip单元,了解低级别压缩和一个简单的.zip读写器,以及SynZipFiles(用于SynProject)中更进化的类。对于像madzip这样的纯Delphi版本,请检查PasZip单元,它比madzip更快(但PasZip不会使用Unicode Delphi编译,而SynZip会使用)。
实际上,确保文件标识的最佳实践是存储内容哈希(例如:CRC-32或任何其他哈希函数)和文件大小。这样做将大大提高可靠性。回复:存储-不需要对已知多次未更改的内容计算哈希。