请问在DELPHI下怎么比较两个文件是否一样? ( 积分: 100 )

  • 主题发起人 主题发起人 haoslm
  • 开始时间 开始时间
H

haoslm

Unregistered / Unconfirmed
GUEST, unregistred user!
请问在DELPHI下怎么比较两个文件是否一样?
 
For过去,一个字节一个字节比较。
 
代码:
assign(F,'F1.Txt');
Assign(FF,'F2,.Txt');
Reset(F); Reset(FF);
if Sizeof(F)<>Sizeof(FF) then
Dif:=True
else
begin
for I:=1 to Sizeof(F) do
begin
readln(F,C1);
Readln(FF,C2);
if C1<>C2 then
begin
Dif:=True;
Exit;
end;
end;
Dif:=False;
end;
 
你要看什么文件了!简单说就是比较MD5,这个一样的话这两个文件就绝对一样,哪怕文件名不一样
 
有没有简单点的方法,WINDOWS 下不是有个比较文件的命令吗?有象那样的吗?
如果一个字节一个字节比较的话,如果文件好几个G那比较时间不得老长了.用MD5怎么比较呀?
我想做一个同步软件!
 
盒子里的例子到处都是.自己找找去.
 
如果要安全的判断文件是否相同必须每个字节都比较的
用MD5不错
 
今天的全文检索用不了了
 
晕,MD5不但要遍历每个字节,还要计算.
比一个字节一个字节比较还慢.
 
楼上正解,MD5只是一种加密算法,使用前需要先计算,这样反而比一个字节一个字节比较还慢
 
MD5不是加密算法,MD5是单项散列算法
 
其实非常简单,两个文件各读一个Buf(假设1K数据),CompareMemory比较一下,如果一致,继续读下一个Buf,读完了都一致则两个文件相同;如果CompareMemory不一致,那就不用继续读了,两者不同。
 
CompareMemory是什么?
 
以前的一个贴子,我复制一下
//函数

function Are2FilesEqual(const File1, File2: TFileName): Boolean;
var
ms1, ms2: TMemoryStream;
begin
Result := False;
ms1 := TMemoryStream.Create;
try
ms1.LoadFromFile(File1);
ms2 := TMemoryStream.Create;
try
ms2.LoadFromFile(File2);
if ms1.Size = ms2.Size then
Result := CompareMem(ms1.Memory, ms2.memory, ms1.Size);
finally
ms2.Free;
end;
finally
ms1.Free;
end
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Opendialog1.Execute then
if Opendialog2.Execute then
if Are2FilesEqual(Opendialog1.FileName, Opendialog2.FileName) then
ShowMessage('文件相等.')
else
ShowMessage('文件不相等');
end;
 
楼上的代码是一次把文件装进内存的,需要占用与这个文件相同大小内存,
用来比较小的文件还可以,比较大的文件就会很慢。

zqw0117的方法是最快的。

procedure TForm1.Button1Click(Sender: TObject);
var
file1,file2:TFileStream;
b1,b2:array [0..32767] of byte; //Buf 32k * 2 (我的机器设32K的buf是最快的);
len:integer;
begin
file1 := TFileStream.Create('C:/bak.dat',fmOpenRead);
file2 := TFileStream.Create('C:/bak2.dat',fmOpenRead);
try
if file1.Size <> file2.Size then
begin
ShowMessage('文件不相等.');
exit;
end;

while file1.Position < file1.Size do
begin
len:=file1.Read(b1,length(b1));
file2.Read(b2,length(b2));

if not CompareMem(@b1[0],@b2[0],len) then
begin
ShowMessage('文件不相等.');
exit;
end;
end;

showmessage('文件相等.');

finally
file1.Free;
file2.Free;
end;
end;
 
楼上的可行,每次读取一部分,比较一部分,然后再读取一部分。。。比较省内存
 
比较修改时间,比较大小,比较版本.
 
后退
顶部