Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#25

AW: Unerwarteter OutOfMemory-Fehler

  Alt 8. Okt 2010, 14:57
Wenn man von einer Datei einen MD5-Hash erstellt und dazu nochmal einen CRC32 und diese beiden Werte gleich sind nebst der Größe, dann kann man die Datei getrost als gleich ansehen

Für einen direkten Vergleich der dann noch vorhandenen Dateien kann man mittels FileStream lösen indem dann Byte für Byte verglichen wird. Dazu werden die Dateien aber nicht in den Speicher geladen.

BTW. es gibt da Backup-Programme, die sehr gut funktionieren, die entscheiden darüber, ob die Datei schon gesichert ist oder nicht über Hash-Werte.
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5FromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      Result := idmd5.HashStreamAsHex( fs );
    finally
      fs.Free;
      idmd5.Free;
    end;
  end;
oder hier die ganz genaue Variante mit MD5, CRC32 und Größe
Delphi-Quellcode:
uses IdHash, IdHashMessageDigest;

{...}

function MD5H32SizeFromFile( const FileName : string ) : string;
  var
    idmd5 : TIdHashMessageDigest5;
    idh32 : TIdHash32;
    fs : TFileStream;
  begin
    idmd5 := TIdHashMessageDigest5.Create;
    idh32 := TIdHash32.Create;
    fs := TFileStream.Create( FileName, fmOpenRead or fmShareDenyWrite );
    try
      fs.Position := 0;
      Result := idmd5.HashStreamAsHex( fs );
      fs.Position := 0;
      Result := Result + idh32.HashStreamAsHex( fs );
      Result := Result + IntToHex( fs.Size, 8 );
    finally
      fs.Free;
      idmd5.Free;
      idh32.Free;
    end;
  end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Okt 2010 um 15:07 Uhr)
  Mit Zitat antworten Zitat