Thema: Delphi ftpgetfile();

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#10

AW: ftpgetfile();

  Alt 6. Dez 2011, 11:08
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Dez 2011 um 11:34 Uhr)
  Mit Zitat antworten Zitat