Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   indy ftp und checksummen - klappt nicht? (https://www.delphipraxis.net/158166-indy-ftp-und-checksummen-klappt-nicht.html)

andreasm82 8. Feb 2011 10:34

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:
http://id.kihiwi.de/WladiD/Kis/Kann_...435/index.html
und
http://www.swissdelphicenter.ch/torr...ode.php?id=324

Transfermodi Ascii und binary habe ich beide probiert.. :(

Was könnte ich noch probieren?

shmia 8. Feb 2011 11:10

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;

Klaus01 8. Feb 2011 11:11

AW: indy ftp und checksummen - klappt nicht?
 
Hallo,

wird denn beim Erstellen des Hash nicht auch der Filename berücksichtigt?

Grüße
Klaus

andreasm82 8. Feb 2011 12:34

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!

shmia 8. Feb 2011 12:39

AW: indy ftp und checksummen - klappt nicht?
 
Zitat:

Zitat von andreasm82 (Beitrag 1080317)
Nun funktioniert es!

Die Funktion CompareFiles() ist schneller als jeweils den Hash von zwei Dateien zu vergleichen.

mjustin 8. Feb 2011 15:02

AW: indy ftp und checksummen - klappt nicht?
 
Zitat:

Zitat von shmia (Beitrag 1080320)
Zitat:

Zitat von andreasm82 (Beitrag 1080317)
Nun funktioniert es!

Die Funktion CompareFiles() ist schneller als jeweils den Hash von zwei Dateien zu vergleichen.

Funktioniert CompareFiles denn auch, wenn eine der beiden Dateien nur über FTP erreichbar ist?

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