Falsch.
FtpGetFile liefert sehr wohl eine Fehlermeldung:
Zitat von
RaiseLastOSError:
Der Aufruf einer Systemfunktion ist fehlgeschlagen.
Grund: ist auch klar, wenn man die Parameter vertauscht hat, beim FtpRetFile-Aufruf.
Localfile, Remotefile ... man sollte sich eben auch mal ansehn, was da gemacht wird und ob die Parameter auch stimmen, so wie sie im
MSDN vorgegeben sind.
Die Beiden sind nä,lich genau gleich aufgebaut ... einfach
Ftp*etFile(Connection, Von, Nach, ...)
.
Außerdem sollte man sich, bei solchen Funktionen, welche blöder Weise GetLastError oftmals auch setzen, selbst wenn kein Fehler auftrat,
diesen merken, bevor man weitere solcher Funktion ausruft, welche diesen Wert dann verfäschen würden. (was sie hier auch tun)
Außerdem sollte man jede Funktion einzeln behandeln, wenn, so wie es hier vorliegt, Funktionsaufrufe aufeinander aufbauen, bzw. von den Vorgängern abhängig sind.
Delphi-Quellcode:
uses
WinInet;
function GetFtpFile(Server, Username, Password, LocalFile, RemoteFile: String; Port: Word = 21; RaiseException: Boolean = False): Boolean;
var
Internet, Connection: HINTERNET;
Error: HRESULT;
begin
Result := False;
if (ExcludeTrailingPathDelimiter(LocalFile) <> LocalFile)
or DirectoryExists(ExcludeTrailingPathDelimiter(LocalFile)) then begin
SetLastError(ERROR_INVALID_PARAMETER); // da FtpGetFile bei sowas nur einen allgemeinen, nichtssagenden Fehler wirft
Exit;
end;
if not DirectoryExists(ExtractFileDir(LocalFile)) then begin
SetLastError(ERROR_PATH_NOT_FOUND); // da FtpGetFile bei sowas nur einen allgemeinen, nichtssagenden Fehler wirft
Exit;
end;
Internet := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
if Assigned(Internet) then
try
Connection := InternetConnect(Internet, PChar(Server), Port, PChar(Username), PChar(Password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
Error := GetLastError;
if Assigned(Connection) then
try
Result := FtpGetFile(Connection, PChar(RemoteFile), PChar(LocalFile), False, 0, FTP_TRANSFER_TYPE_BINARY, 0);
Error := GetLastError;
finally
InternetCloseHandle(Connection);
end;
finally
InternetCloseHandle(Internet);
if not Result then SetLastError(Error);
end;
if RaiseException then
RaiseLastOSError;
end;
Delphi-Quellcode:
if not GetFtpFile(... {, False}) then
RaiseLastOSError;
// oder
GetFtpFile(..., True);