also ich habe während ich vorhin den o.g. beitrag von negaH gelesen habe, einen test mit TFileStream laufen lassen.
dabei wurden wieder die beiden doppelten dateien verglichen (s. screenshot irgendwo vorne). dauer ca. 700 sekunden.
edit: also byte-per-byte.
gerade habe ich negaH's code eingebaut und der vergleich dauert 3,44 sekunden.
erstaunlich. ich muss mir mal die hilfe zu den
api befehlen (CreateFileMapping, usw.) ansehen, damit ich genauer verstehe, was sich hinter memory mapped files genau verbirgt.
edit2: falls du es auch testen willst, hier der entsprechende code (ohne negaH's o.g. code. den habe ich einfach mal in die
unit mit reinkopiert. einzige änderung war, dass ich Tmmf in TMemoryMappedFile umbenannt habe):
Delphi-Quellcode:
function Tmf.FilesAreBinaryEqual(const File1, File2: String): Boolean;
const
BlockSize = 65536;
var
//FSFile1, FSFile2: TFileStream;
FSFile1, FSFile2: TMemoryMappedFile;
L1, L2: Integer;
B1, B2: Array[1..BlockSize] of Byte;
begin
Result := False;
//FSFile1 := TFileStream.Create(File1, fmOpenRead or fmShareDenyWrite);
FSFile1 := TMemoryMappedFile.Create(File1);
try
//FSFile2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyWrite);
FSFile2 := TMemoryMappedFile.Create(File2);
try
if FSFile1.Size = FSFile2.Size then
begin
while FSFile1.Position < FSFile1.Size do
begin
L1 := FSFile1.Read(B1[1], BlockSize);
L2 := FSFile2.Read(B2[1], BlockSize);
if L1 <> L2 then
Exit;
if not CompareMem(@B1[1], @B2[1], L1) then
Exit;
end;
Result := True;
end;
finally
FSFile2.Free;
end;
finally
FSFile1.Free;
end;
end;