Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ftpgetfile(); (https://www.delphipraxis.net/97052-ftpgetfile-%3B.html)

Bastler 3. Aug 2007 16:30


ftpgetfile();
 
Hi Leute;
in der CodeLib ist ein ganz netter Code für den Datei Up- und Download (hier).

Könnte mir jemand netter weise die Funktion getfile() schreiben, da ich mich leider nicht mit den Parametern auskenne.

Also qausie das hier:
Delphi-Quellcode:
uses
  WinInet

function putfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpPutFile(hconnect, pchar(localfile), pchar(remotefile), FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;
nur für GET statt für put (inkl. Beispielaufruf bitte)
Wäre übrigens auch ne Gute Idee das dann inner CodeLib zu ergänzen :D;

Danke!

Bastler 4. Aug 2007 09:42

Re: ftpgetfile();
 
So das ganze Rätels hat sich jetz - mit Eurer indirekten Hilfe - gelöst.

An Hand dieses Beitrags habe ich dann etwas rumprobiert und bin zu einem Funktionsfähigen Ergebnis gekommen.

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;
Beispielaufruf:
Delphi-Quellcode:
getfile('http://....de', 'servername', 'serverpasswort', '/test.txt', 'C:\test.txt');
Dieser Post dient nur dem Zweck, den Leuten eine Lösung vorzuschlagen, die später nocheinmal mein Problem haben werden...

Illusion 5. Aug 2007 23:23

Re: ftpgetfile();
 
Heidiho!

Es wird doch in der Code-Lib erklärt das er GetFile-Befehl gleich funktioniert. Die einzigen Unterschiede der Funktionen bestehen ja auch in der 1. und 9. Zeile in denen ein "put" gegen ein "get" getauscht wird. Allerdings könnte man das bestimmt deutlicher formulieren..

Grüße

AirJordan 5. Dez 2011 19:58

AW: Re: ftpgetfile();
 
Zitat:

Zitat von Bastler (Beitrag 658366)
So das ganze Rätels hat sich jetz - mit Eurer indirekten Hilfe - gelöst.

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;

Hat das mal wirklich einer so wie vom Kollegen beschrieben hinbekommen? Egal wo man sucht, egal wo man Tutorials
durchstöbert, findet man immer das Beispiel mit dem InternetReadFile etc. Aber mit FtpGetFile nichts!

Bei mir hat auch nur die InternetReadFile Sache geklappt, ich fand es aber blöd, das der Aufruf der StatusCallBack
Routine nur beim Upload genutzt werden konnte. Also habe ich das umgestrickt und nun klappt der Upload mit Progressbar,
aber der Download funzt null-komma-null. :(

Zitat:

Zitat von Bastler (Beitrag 658366)
Dieser Post dient nur dem Zweck, den Leuten eine Lösung vorzuschlagen, die später nocheinmal mein Problem haben werden...

Ja schön, wenn es so wäre...

Lg Holger

Luckie 5. Dez 2011 20:37

AW: ftpgetfile();
 
Was willst du uns jetzt mit den Beitrag sagen? Wenn es bei dir nicht funktioniert, wäre es wohl hilfreich, wenn du uns sagst, was nicht funktioniert und was du eventuell für eine Fehlermeldung bekommst.

AirJordan 6. Dez 2011 04:44

AW: ftpgetfile();
 
Zitat:

Zitat von Luckie (Beitrag 1139563)
Was willst du uns jetzt mit den Beitrag sagen? Wenn es bei dir nicht funktioniert, wäre es wohl hilfreich, wenn du uns sagst, was nicht funktioniert und was du eventuell für eine Fehlermeldung bekommst.

Ja, sehr gerne kann ich das beschreiben:

... nix ...

passiert. FtpGetFile wirft ein false zurück und das war´s. GetLastError bleibt ruhig und eine Exception
wird auch nicht geworfen. In der FTPSession (also hier das hConnect) kann ich auf den FTP Server die Datei
mit FtpOpenFile auch öffnen und die Größe auslesen und der Pfad und die lokalen Datei wird auch korrekt übergeben.

Und jetzt kommst Du. :-D

Lg Holger

Luckie 6. Dez 2011 08:13

AW: ftpgetfile();
 
Zitat:

Zitat von AirJordan (Beitrag 1139610)
... nix ...

Und an welcher Stelle deines vorherigen Beitrages sollte ich das rauslesen können?

Zitat:

Und jetzt kommst Du. :-D
Muss ich? Nur mit deinem vorherigen Beitrag, hätte keiner was anfangen können, da bin ich mir ziemlich sicher.

AirJordan 6. Dez 2011 09:23

AW: ftpgetfile();
 
Zitat:

Zitat von Luckie (Beitrag 1139634)
Und an welcher Stelle deines vorherigen Beitrages sollte ich das rauslesen können?

Aus dem gesamten! Ich habe geschrieben, dass das FtpGetFile "benutzt" wird und das dort
nichts passiert.

Zitat:

Zitat von Luckie (Beitrag 1139634)
Muss ich?

Nein, keiner muss. Wir müssen alle nur irgendwann mal sterben. Aber sonst muss keiner etwas.

Aber mit diesen distanzierten Wortspielen komme ich sicherlich nicht an die Lösung
meines Problems. :(

Wünsche Dir noch eine schöne Woche!

Lg Holger

DeddyH 6. Dez 2011 09:38

AW: ftpgetfile();
 
Werte doch erst einmal die beiden HINTERNET aus. Wenn eins davon 0 ist, dann weiß man ja zumindest schonmal, wo es hakt.

himitsu 6. Dez 2011 10:08

AW: ftpgetfile();
 
Zitat:

Zitat von AirJordan (Beitrag 1139610)
... nix ...

Falsch.

FtpGetFile liefert sehr wohl eine Fehlermeldung:

Zitat:

Zitat von RaiseLastOSError
Der Aufruf einer Systemfunktion ist fehlgeschlagen.

Grund: ist auch klar, wenn man die Parameter vertauscht hat, beim FtpRetFile-Aufruf. :roll:
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
Delphi-Quellcode:
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);


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Seite 1 von 2  1 2      

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