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;