![]() |
AW: 2 Textdateien vergleichen
Ich schließe mich lxo da voll und ganz an.
Dateigröße prüfen, wenn gleich dann einen Hash/Crc Wert beider Dateien vergleichen. Dabei ist es völlig egal ob es Text oder Binär Inhalt ist.
Delphi-Quellcode:
//edit
uses
WinApi.Windows, System.Hash; // um Dateigrößen >4GB zu ermitteln function GetFileSize(const aFilename: String): Int64; var info: TWin32FileAttributeData; begin Result := -1; if NOT GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info) then Exit; Result := Int64(info.nFileSizeLow) or Int64(info.nFileSizeHigh shl 32); end; // von lxo aus Delphi-Praxis function GetHashMD5(const Datei: String): String; begin Result := THashMD5.GetHashStringFromFile(Datei); end; //beispiel, nur hier per editor... ungetestet function IsEqualFile(const Datei1, Datei2: String): Boolean; begin Result := ( (GetFileSize(Datei1) = GetFileSize(Datei2)) and (GetHashMD5(Datei1) = GetHashMD5(Datei2)) ); end; code beispiel angefügt |
AW: 2 Textdateien vergleichen
Zitat:
Zitat:
|
AW: 2 Textdateien vergleichen
Zitat:
Definiere "elegant" :P Mit unklaren Anforderungen bekommt man meist nicht das was man erwartet. :-) |
AW: 2 Textdateien vergleichen
Zitat:
Ist angenehmer zu verwenden und gerade kurz getestet auch schneller.
Code:
uses
System.Hash; begin THashMD5.GetHashStringFromFile( 'C:\Test.txt'); end; |
AW: 2 Textdateien vergleichen
Zitat:
Zitat:
|
AW: 2 Textdateien vergleichen
Hab den Schnippsel überarbeitet, Danke @lxo
|
AW: 2 Textdateien vergleichen
Kleiner Tipp noch für alle die DevExpress nutzen.
Da gibt es auch die Unit dxHash.pas Die kriegen das nochmal schneller hin als System.Hash |
AW: 2 Textdateien vergleichen
Zitat:
Wenn Du mit elegant möglichs kurzen Code meinst, dass ist das mit dem Hash m.E. am Besten. Wenn es dagegen z.B. um die Laufzeit geht gibt es sicher noch schnellere Methoden, einiges wurde ja hier auch schon andiskutiert. Zudem: Beyond Compare hat zig. Optionen mit denen man einstellen kann was man mit "gleich" meint ;-) |
AW: 2 Textdateien vergleichen
Hallo,
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
ein korrektes Ergebnis. Der Rückgabewert
False
Delphi-Quellcode:
ist unbrauchbar, denn es fehlt noch der Byteweise Vergleich.
True
|
AW: 2 Textdateien vergleichen
Zitat:
Hättest Du die Güte ein Beispiel zu posten damit das was Du sagst nachvollziehbar ist? Das 2 unterschiedliche Dateien den gleichen MD5 Hash liefern... möglich ja aber eher die Ausnahme als die Regel. Ich hatte halt Geschwindigkeit im Vordergrund. so etwas hier wollte ich verhindern... gefunden auf Stackoverflow, code von David
Delphi-Quellcode:
// Usage example
var lError: Integer; ... if FilesAreIdentical(lError, 'file1.ext', 'file2.ext') then Memo1.Lines.Append('Files are identical.') else case lError of 0: Memo1.Lines.Append('Files are NOT identical!'); 1: Memo1.Lines.Append('Files opened, stream read exception raised!'); 2: Memo1.Lines.Append('File does not exist!'); 3: Memo1.Lines.Append('File open exception raised!'); end; // case ... // StreamAreIdentical function StreamsAreIdentical(var aError: Integer; const aStream1, aStream2: TStream; const aBlockSize: Integer = 4096): Boolean; var lBuffer1: array of byte; lBuffer2: array of byte; lBuffer1Readed, lBuffer2Readed, lBlockSize: integer; begin Result:=False; aError:=0; try if aStream1.Size <> aStream2.Size then Exit; aStream1.Position:=0; aStream2.Position:=0; if aBlockSize>0 then lBlockSize:=aBlockSize else lBlockSize:=4096; SetLength(lBuffer1, lBlockSize); SetLength(lBuffer2, lBlockSize); lBuffer1Readed:=1; // just for entering while while (lBuffer1Readed > 0) and (aStream1.Position < aStream1.Size) do begin lBuffer1Readed := aStream1.Read(lBuffer1[0], lBlockSize); lBuffer2Readed := aStream2.Read(lBuffer2[0], lBlockSize); if (lBuffer1Readed <> lBuffer2Readed) or ((lBuffer1Readed <> lBlockSize) and (aStream1.Position < aStream1.Size)) then Exit; if not CompareMem(@lBuffer1[0], @lBuffer2[0], lBuffer1Readed) then Exit; end; // while Result:=True; except aError:=1; // stream read exception end; end; // FilesAreIdentical using function StreamsAreIdentical function FilesAreIdentical(var aError: Integer; const aFileName1, aFileName2: String; const aBlockSize: Integer = 4096): Boolean; var lFileStream1, lFilestream2: TFileStream; begin Result:=False; try if not (FileExists(aFileName1) and FileExists(aFileName2)) then begin aError:=2; // file not found Exit; end; lFileStream1:=nil; lFileStream2:=nil; try lFileStream1:=TfileStream.Create(aFileName1, fmOpenRead or fmShareDenyNone); lFileStream2:=TFileStream.Create(aFileName2, fmOpenRead or fmShareDenyNone); result:=StreamsAreIdentical(aError, lFileStream1, lFileStream2, aBlockSize); finally if lFileStream2<>nil then lFileStream2.Free; if lFileStream1<>nil then lFileStream1.Free; end; // finally except aError:=3; // file open exception end; // except end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz