![]() |
Ok, wenn ich wissen will, ob meine Ver- Entschlüsselung geht, dann ist mir jede Checksumme zu ungenau. Also vergleich ich den Kram Byte für Byte.
...Never mind... |
Delphi-Quellcode:
Wenn der jetzt an #002a oder #002b rausspringt, kann das andere Gründe haben, als dass die Datei von einem anderen Programm geöffnet ist? Also zu groß... oder so was
//Dateivergleich
procedure TForm1.Button8Click(Sender: TObject); var Rein, Raus: TFileStream; ReinKB, RausKB: array[0..1023] of byte; x,y,i:integer; begin for i := 0 to 1023 do begin ReinKB[i] := 0; RausKB[i] := 0; end; try Rein := TFileStream.Create(LabeledEdit1.Text, fmOpenRead); except ShowMessage('Fehler beim Öffnen der Dateien! #002a'); Exit; end; try Raus := TFileStream.Create(LabeledEdit2.Text, fmOpenRead); except Rein.Free; ShowMessage('Fehler beim Öffnen der Dateien! #002b'); Exit; end; repeat begin x := Rein.Read(ReinKB, 1024); y := Raus.Read(RausKB, x); if x <> y then begin ShowMessage('Unterschiedlich - Dateivergleich negativ, Dateilängen falsch! #003'); Rein.Free; Raus.Free; Exit; end; for i := 0 to 1023 do if ReinKB[i] <> RausKB[i] then begin ShowMessage('Unterschiedlich - Dateivergleich negativ, Abweichung festgestellt! #004'); Rein.Free; Raus.Free; Exit; end; end; until x = 0; ShowMessage('Gleich - Dateivergleich postiv'); Rein.Free; Raus.Free; end; |
Mir ist grade was aufgefallen an dem Code. Wenn die zweite Datei länger ist als die erste, können die immer noch als gleich getestet werden. Wird behoben. Aber meine eigentliche Frage bleibt. :coder:
|
Moin Nailor,
wenn Du vor der Prüfschleife einfach rein.size und raus.size vergleichst, und dann zu dem Ergebnis kommst, dass die Werte ungleich sind, können die Dateien schon mal nicht gleich sein. Dazu musst Du nicht erste eine der beiden durchlesen. Ausserdem fehlt noch der try/finally Block der garantiert, dass die belegten Resourcen wieder freigegeben werden. Wenn Du die beiden Buffer nicht als array of Byte sondern schlicht als Strings deklarierst, und jeweils auf 1024 würdest Du Dir auch die zweite Schleife einsparen können. Für den letzten Vergleich (es werden weniger als 1024 Zeichen gelesen) müsste dann allerdings verkürzt verglichen werden, also z.B. mit Copy(sRaus,1,ReadByte) <> Copy(sRein,1,ReadByte). Was mir jetzt noch fehlt: Welche eigentliche Frage meinst Du? |
Wenn der jetzt an #002a oder #002b rausspringt, kann das andere Gründe haben, als dass die Datei von einem anderen Programm geöffnet ist? Also zu groß... oder so was
---- zb. ram... |
Moin Nailor,
das dürfte an den genannten Stellen eigentlich nur passieren, wenn die Datei schon anderweitig geöffnet ist, oder nicht existiert. Probier doch mal statt Deines ShowMessage folgende Variante:
Delphi-Quellcode:
Dann sollte Dir die passende Windowsfehlermeldung präsentiert werden.
ShowMessage(SysErrorMessage(GetLastError));
Da TFileStream intern auf der API CreateFile basiert sollte das eine sinnvolle Meldung bringen. Oder aber, Du schreibst einfach in den except Abschnitt, unmittelbar vor das exit noch eine Zeile in der raise; steht. Dann wird die zuletzt ausgelöste Exception noch einmal ausgelöst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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