Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: FTP uploadversuche Zählen.

  Alt 27. Dez 2013, 16:53
Wenn beim Übertragen ein Fehler auftaucht, dann wird eine Exception geworfen, diese kann man einfach abfangen und wenn die Anzahl der Versuche überschritten ist, dann einfach weiterreichen.

Delphi-Quellcode:
procedure UploadFile( AFtpConnection : TIdFTP; const ASourceFileName : string; ARetries : Integer = 3 );
  var
    LCount : Integer;
    LSuccess : Boolean;
  begin
    LCount := 0;
    LSuccess := False;

    if not AFtpConnection.Connected
    then
      AFtpConnection.Connect;

    repeat

      try
        Inc( LCount );
        AFtpConnection.Put( ASourceFileName );
        LSuccess := True;
      except
        on EIdFTPException do
          begin
            if ( LCount >= ARetries )
            then
              raise;
          end;
      end;

    until LSuccess;
  end;
Aufruf mit
Delphi-Quellcode:
try
  UploadFile( IdFTP1, MyFileName, 3 );
  // Hier jetzt die Datei als versendet markieren
  ...
except
  on E: Exception do
    begin
      // Hier jetzt die Datei als failed markieren
      ...
      // und den Fehler weiterreichen
      raise;
    end;
  on E: EIdFTPException do
    begin
      // Hier jetzt die Datei als failed markieren
      ...
      // Wenn mit der Markierung der Fehler hinreichend behandelt ist, dann die Exception nicht mehr weiterreichen
    end;
end;
Damit hat man schon mal sichergestellt, dass die Übertragung funktioniert hat und die Datei nun auf dem Server sein sollte.

Zusätzlich kann dann noch geprüft werden, ob die Datei existiert, die Größe passt und mit TIdFTP.VerifyFile die HashWerte von Quelle und Ziel überprüfen.

Wenn da was nicht passt, einfach eine Exception werfen (Eine EIdFTPException würde sich bei dem Code anbieten).

z.B. so (nur mit VerifyFile)
Delphi-Quellcode:
procedure UploadFile( AFtpConnection : TIdFTP; const ASourceFileName : string; ARetries : Integer = 3 );
  var
    LRemoteFileName : string;
    LCount : Integer;
    LSuccess : Boolean;
  begin
    LCount := 0;
    LSuccess := False;

    if not AFtpConnection.Connected
    then
      AFtpConnection.Connect;

    LRemoteFileName := ExtractFileName( ASourceFileName );

    repeat

      try
        Inc( LCount );
        AFtpConnection.Put( ASourceFileName, LRemoteFileName );
        LSuccess := True;
      except
        on EIdFTPException do
          begin
            if ( LCount >= ARetries )
            then
              raise;
          end;
      end;

    until LSuccess;

    if not AFtpConnection.VerifyFile( ASourceFileName, LRemoteFileName )
    then
      begin
        AFtpConnection.Delete( LRemoteFileName );
        raise EIdFTPException.Create( 'FileHash mismatch' );
      end;
  end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (27. Dez 2013 um 16:58 Uhr)
  Mit Zitat antworten Zitat