Einzelnen Beitrag anzeigen

Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#43

Re: Eindeutiger Vergleich für große Dateien gesucht

  Alt 3. Aug 2005, 01:41
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;
  Mit Zitat antworten Zitat