Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   FTP uploadversuche Zählen. (https://www.delphipraxis.net/178247-ftp-uploadversuche-zaehlen.html)

ngott2 27. Dez 2013 09:02

FTP uploadversuche Zählen.
 
Ich habe ein Upload Programm geschrieben. Das soll nun noch um eine Funktion erweitert werden und zwar wenn eine Datei 3 mal nicht hochgeladen wird ihr Status auf Failed gesetzt wird. Ich benutze die IndyFTP Komponente. Da der Befehl put kein Boolean zurück gibt den man auswerten kann oder sogar was der Server antwortet weiß ich nicht wie ich die Versuche zählen soll.

Meine Idee wäre es immer nach einem Versuch zu kucken ob die Datei auf dem Server liegt. Aber das ist mit Sicherheit die schlechteste Lösung oder ?
Falls einer eine Idee hat immer her damit :D

MFG Florian Middendorf

Ps. Ich hoffe ihr hattet ein schönes Weihnachtsfest.:)

Bjoerk 27. Dez 2013 09:08

AW: FTP uploadversuche Zählen.
 
Ich denke, das sollte man schon so machen. Also schauen ob die Datei auf dem Server vorhanden ist und auch ob die Datei die gleiche Größe und Version hat.

Sir Rufo 27. Dez 2013 15:53

AW: FTP uploadversuche Zählen.
 
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
Delphi-Quellcode:
TIdFTP.VerifyFile
die HashWerte von Quelle und Ziel überprüfen.

Wenn da was nicht passt, einfach eine Exception werfen (Eine
Delphi-Quellcode:
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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