![]() |
indy ftp und checksummen - klappt nicht?
Von einem FTP Server möchte ich Konfigdaten automatisiert herunterladen und mit der lokalen gespeicherten Datei vergleichen. Bei einer Änderung soll ich benachrichtigt werden.
Herunterladen und Benachrichtigung ist kein Thema, doch der Vergleich klappt nicht. Ich habe zuerst an einen reinen Größenvergleich gedacht, was im Grunde funktioniert. Wird jedoch nur eine Ziffer in der .txt Datei geändert, bleibt ja die Größe gleich - aber die Datei ist anders. MD5 Checksummenberechnung funktioniert seltsamerweise nicht. Die alte, heruntergeladene Datei init.txt ist anders als die neu geladene init.txt2.txt. Zumindest laut der MD5 Routine. Das Programm winmerge zeigt mir jedoch an, dass beide identisch sind. auch die Größe ist die gleiche. ausprobiert habe ich hierfür: ![]() und ![]() Transfermodi Ascii und binary habe ich beide probiert.. :( Was könnte ich noch probieren? |
AW: indy ftp und checksummen - klappt nicht?
Checksummen wie z.B. MD5 lohnen ja nur dann, wenn die Checksumme einmal erstellt wird und dann mehrmals verwendet wird.
Oder eine weitere Anwendung wär, dass man nur die Checksumme herunterlädt und dann mit der Checksumme der lokalen Datei überprüft. Damit vermeidet man das Herunterladen der Datei, die sehr gross sein kann. In deinem Fall vermute ich aber, dass du jedes Mal die Checksummen beider Dateien berechnest. Dann kannst du aber auch gleich die Dateien direkt vergleichen:
Delphi-Quellcode:
function CompareStreams(const A, B : TStream): Boolean;
const BUFSIZE = 8192; var bufA, bufB : string; r : Integer; begin if A.Size <> B.Size then Result := False else begin A.Position := 0; B.Position := 0; SetLength(bufA, BUFSIZE); SetLength(bufB, BUFSIZE); while A.Position < A.Size do begin r := A.Size - A.Position; // da die Properties [TStream].Size & .Position ab Delphi 6 // als Int64 deklariert sind, könnte ein Überlauf im Integer "r" auftreten. // dies wird berücksichtigt durch "r<=0" if (r > BUFSIZE) or (r<=0) then r := BUFSIZE; A.ReadBuffer(bufA[1], r); B.ReadBuffer(bufB[1], r); if not CompareMem(PChar(bufA), PChar(bufB), r) then begin Result := False; Exit; end; end; Result := True; end; end; function CompareFiles(const file1, file2:string):Boolean; var a, b : TStream; begin a := TFileStream.Create(file1, fmOpenRead or fmShareDenyWrite); try b := TFileStream.Create(file2, fmOpenRead or fmShareDenyWrite); try Result := CompareStreams(a, b); finally b.Free; end; finally a.Free; end; end; |
AW: indy ftp und checksummen - klappt nicht?
Hallo,
wird denn beim Erstellen des Hash nicht auch der Filename berücksichtigt? Grüße Klaus |
AW: indy ftp und checksummen - klappt nicht?
"wird denn beim Erstellen des Hash nicht auch der Filename berücksichtigt?"
Scheinbar ja. Die Dateien liegen nun in unterschiedlichen Ordnern mit gleichem Namen: Nun funktioniert es! |
AW: indy ftp und checksummen - klappt nicht?
Zitat:
|
AW: indy ftp und checksummen - klappt nicht?
Zitat:
Und selbst wenn - bei einem "Man in the Middle" Angriff auf der FTP Leitung, bei dem eine manipulierte Datei statt der echten übermittelt wird, sähe vermutlich dann auch die Checksumme für beide Dateien gleich aus - obwohl die auf dem Server liegende Originaldatei effektiv eine ganz andere Checksumme hat :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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