delphi比较文本文件内容

时间:2011-06-03 11:03:21

标签: delphi file compare

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

我目前使用每个文件的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;

问候,彼得。

4 个答案:

答案 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:存储 - 不需要计算已知多次更改的内容的哈希值。