Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphi比较文本文件内容_Delphi_File_Compare - Fatal编程技术网

delphi比较文本文件内容

delphi比较文本文件内容,delphi,file,compare,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 f

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

我目前使用每个文件的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;
//使用madZIP计算此文件的CRC值
GetUncompressedFileInfo(文件名为1,大小为1,新CRC);
//使用madZIP计算此文件的CRC值
GetUncompressedFileInfo(文件名2,大小2,OldCRC);
//如果ThisFileHash=ExistingFileHash,则
如果(OldCRC NewCRC)那么
创建备份;

你好,彼特。

CRC可能更准确,效率也更高。但是,您需要检查内容吗


我假设您正在检查CRC以查看是否进行了修改,并重新备份更新的文件。在这种情况下,FileAge()就可以了。

CRC不是检测文件更改的安全方法-加密哈希(如MD5或SHA1)要好得多


另一种方法(如构建系统使用的方法)是比较文件日期。如果文件比备份更新,则需要新的备份

实际上,确保文件标识的最佳实践是存储内容哈希(例如:CRC-32或任何其他哈希函数)和文件大小。这样做将大大提高可靠性。Re:要存储——不需要对已知的内容多次进行哈希计算。

您也应该考虑使用增量备份。 我已经为我们的开源工具发布了一些优化的文件版本控制函数。

TVersions
类的单位允许在zip容器中存储二进制差异

我们的专有但比zip更快的技术用于存储增量差异。它在实践中效果很好

请参阅例如
TVersions.FillStrings
method以检索要更新的文件列表

请注意,您可能会发现一个小时的差异,这取决于当前的夏令时。以下是我们如何允许按日期进行比较:

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;
我们在这里不读取文件内容。出于备份目的,仅依靠文件日期即可将文件标记为要比较的文件。然后对文件的两个版本执行差异。如果文件内容相同,它将只存储日期差异


依我看,您不应该使用专有的madzip容器,而应该使用标准容器,如.zip。有几种,包括我们在SynProject中使用的版本或我们的ORM。它比MadZip快,并且在优化的asm中解压。请参阅单元中的低级压缩和简单的.zip读写器,以及(在SynProject中使用的)中更高级的类。对于纯Delphi版本,如madzip one,请检查比madzip快的单元(但是PasZip不会使用Unicode Delphi编译,而SynZip会使用Unicode Delphi编译)。

是的。我们只想在内容改变的情况下进行备份,就像BugFinder说的那样。CRC之前的文件大小可以节省您大部分时间的工作。否则,CRC是我所知道的最有效的比较内容的方法。对快速有效的CRC例程有什么建议吗?除了CRC,最好检查文件大小。比较的参数越多越好。但是要检查
FileAge()
请注意,使用NTFS时,您可能会发现根据夏令时时区的不同,会有一个小时的变化……Id要做的唯一一件事是首先检查大小,如果大小不同,则文件也会不一样。这是一个简单但快速的预检查,如果大小不同,您可以加快它的速度,而不必费心做CRC检查。您认为CRC解决方案的效率和优雅究竟是什么?我正在重写现有的解决方案,我正在寻找改进现有代码的方法。我并不是说CRC是低效的,但是可能有另一种方法来获得与我的需求更好的相同结果。如果你正在重写,考虑使用RSyc而不是自己的片状增量备份。为此目的,不需要加密安全哈希。这只是一个备份场景。@Bauuu friend:CRC有更高的误报概率,它可以说两个文件是相同的,即使它们不是。最安全的方法是比较最后一次更改的日期和时间,以及具有足够位数的哈希,以确保冲突的可能性很小。128、256或事件512位哈希。事实上,几乎所有好的备份和其他类似的软件都是这样工作的。CRC误报为+1,这对于备份场景来说可能是个问题。但是文件日期可能会被误判,因为我发现有时,在NTFS中,
FileAge
可能会返回一个小时的变化,这取决于夏令时时区……这就是为什么如果文件日期不同,您总是检查哈希。
FileAge()
使用本地时钟和时区(通过调用
FileTimeToLocalFileTime)()
)。如果改为使用UTC比较,则不会遇到时区问题。
FileTimeToLocalFileTime()
需要UTC时间戳作为输入,这意味着
FileAge()
首先检索UTC,然后在内部对其进行翻译。根据Delphi版本,
FileAge()
使用
FindFirstFile()
GetFileAttributesEx()
访问UTC时间戳。您可以在自己的代码中手动执行相同操作。