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)