AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke FTP uploadversuche Zählen.
Thema durchsuchen
Ansicht
Themen-Optionen

FTP uploadversuche Zählen.

Ein Thema von ngott2 · begonnen am 27. Dez 2013 · letzter Beitrag vom 27. Dez 2013
Antwort Antwort
ngott2

Registriert seit: 26. Aug 2013
81 Beiträge
 
Delphi 10 Seattle Professional
 
#1

FTP uploadversuche Zählen.

  Alt 27. Dez 2013, 09:02
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

MFG Florian Middendorf

Ps. Ich hoffe ihr hattet ein schönes Weihnachtsfest.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: FTP uploadversuche Zählen.

  Alt 27. Dez 2013, 09:08
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.
  Mit Zitat antworten Zitat
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, 15: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 15:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz