Delphi-PRAXiS

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);

AirJordan 6. Dez 2011 10:27

AW: ftpgetfile();
 
Zitat:

Zitat von DeddyH (Beitrag 1139666)
Werte doch erst einmal die beiden HINTERNET aus. Wenn eins davon 0 ist, dann weiß man ja zumindest schonmal, wo es hakt.

Ja, die Idee hatte ich ganz am Anfang auch. Bin aber über beide HINTERNET rüber gekommen
und diese warfen keine Fehler!

Danke Dir für diesen Tipp. :thumb:

Lg Holger

AirJordan 6. Dez 2011 10:31

AW: ftpgetfile();
 
Zitat:

Zitat von himitsu (Beitrag 1139669)
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, ...)
.

Auch ok, habe ich aber auch gemacht. Remote/Localfile String ausgewertet und mir sogar
im ShowMessage anzeigen lassen. 8-) Passte alles. Und vertauscht habe ich sie auch nicht.

Auch für diesen Hinweis danke! :thumb: Den anderen Sourcecode werde ich heute oder morgen
Abend nochmal testen.

Lg Holger

himitsu 6. Dez 2011 10:36

AW: ftpgetfile();
 
Zitat:

Zitat von AirJordan (Beitrag 1139675)
Auch ok, habe ich aber auch gemacht. Remote/Localfile String ausgewertet und mir sogar
im ShowMessage anzeigen lassen. 8-) Passte alles. Und vertauscht habe ich sie auch nicht

Ja, aber hst du dabei auch geschaut, wie die Parameter der aufgerufenen Funktion heißen und was du diesen tatsächlich gibst?



Zitat:

Zitat von Bastler (Beitrag 658366)
... habe ich dann etwas rumprobiert und bin zu einem Funktionsfähigen Ergebnis gekommen.

Delphi-Quellcode:
function getfile(..., localfile, remotefile: string; ...): boolean;
var
  ...
Beispielaufruf:
Delphi-Quellcode:
getfile(..., '/test.txt', 'C:\test.txt');


Fällt Jemandem was auf?

Funktionsfähig ja, aber nur wenn man es "falsch" macht, aber insgesammt alle Parameter-Inhalte irgendwie doch richtig sind. :stupid:

> draußen die Prameter vertauscht und drinnen nochmal (drinnen vergessen umzudrehn)
> oder die Parameter einfach nur falsch benannt (vergessen umzubenennen)

AirJordan 6. Dez 2011 11:52

AW: ftpgetfile();
 
Zitat:

Zitat von himitsu (Beitrag 1139679)
Ja, aber hst du dabei auch geschaut, wie die Parameter der aufgerufenen Funktion heißen und was du diesen tatsächlich gibst?

Ja, habe ich! ShowMessage aufgerufen und dann die Parameter auf die FtpGetFile
übertragen/überprüft. Das passt alles.

Zitat:

Zitat von himitsu (Beitrag 1139679)
Fällt Jemandem was auf?

Funktionsfähig ja, aber nur wenn man es "falsch" macht, aber insgesammt alle Parameter-Inhalte irgendwie doch richtig sind. :stupid:

> draußen die Prameter vertauscht und drinnen nochmal (drinnen vergessen umzudrehn)
> oder die Parameter einfach nur falsch benannt (vergessen umzubenennen)

Ja klar fällt was auf, aber, und das habe ich am Anfang auch geschrieben, habe ich
immer nur die "original" FtpGetFile benutzt. Ich habe nicht die von "Bastler" erstellten
Funktionen übernommen, abgewandelt oder verändert... :-D

Ich schreibe hier zwar wenig, bzw. schon lange nicht mehr so viel, "wohne aber nicht
auf´m Delphi-Baum" :wink::wink::wink:

Lg Holger

himitsu 6. Dez 2011 12:04

AW: ftpgetfile();
 
joar dann ... hmmmmm :gruebel:

AirJordan 6. Dez 2011 13:11

AW: ftpgetfile();
 
Zitat:

Zitat von himitsu (Beitrag 1139710)
joar dann ... hmmmmm :gruebel:

Jaaa, aber wie schon geschrieben. Ich werde Dein Beispiel mal anwenden
und dann sehen wir ja, welche Errors geworfen werden. :-D

Dank´Dir aber schonmal für Deine Tipps. :thumb:

AirJordan 7. Dez 2011 10:47

AW: ftpgetfile();
 
So, das Beispiel ausprobiert. Ich sag nur 12003... der "schönste" Fehler überhaupt... :-D

Zitat:

12003 ERROR_INTERNET_EXTENDED_ERROR
Vom Server wurde ein erweiterter Fehler zurückgegeben. Hier handelt es sich in der Regel
um eine Zeichenfolge oder einen Puffer, der eine ausführliche Fehlermeldung enthält.
Rufen Sie "Call InternetGetLastResponseInfo" auf, um den Fehlertext zu erhalten.
Die Zeichenfolge habe ich ausgelesen... leer. Über die InternetGetLastResponseInfo gibt es
hier auch schon einige Einträge. Ich habe sowieso mit der FtpGetFile zu viel Zeit verbrannt,
also stelle ich wieder auf die InternetReadFile um und gut ist. FtpPutFile klappt ja. :-D

In diesem Sinne
Lg Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz