delphi比较文本文件的内容



我们需要比较两个(或多个)文本文件的内容,以确定是否需要创建备份。如果它们不同,我们将创建一个新的备份。

我目前使用每个文件的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或任何其他哈希函数)文件大小。这样做将大大提高可靠性。回复:存储-不需要对已知多次未更改的内容计算哈希。

相关内容

  • 没有找到相关文章

最新更新