Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: indy ftp und checksummen - klappt nicht?

  Alt 8. Feb 2011, 12:10
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;
Andreas
  Mit Zitat antworten Zitat