AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ftpgetfile();

Ein Thema von Bastler · begonnen am 3. Aug 2007 · letzter Beitrag vom 7. Dez 2011
Antwort Antwort
Bastler

Registriert seit: 15. Aug 2006
153 Beiträge
 
Delphi 7 Personal
 
#1

Re: ftpgetfile();

  Alt 4. Aug 2007, 10:42
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:
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...
Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber beim Universum bin ich mir noch nicht ganz sicher
(A. Einstein)
  Mit Zitat antworten Zitat
Benutzerbild von AirJordan
AirJordan

Registriert seit: 29. Mär 2005
Ort: Hamburg
214 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Re: ftpgetfile();

  Alt 5. Dez 2011, 20:58
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.

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
Holger
Georg Schramm über Lothar Dombrowski:
"Er krankt daran, dass die Leute in einer
schrecklichen Welt leben und lachen..."

_
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: ftpgetfile();

  Alt 5. Dez 2011, 21:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von AirJordan
AirJordan

Registriert seit: 29. Mär 2005
Ort: Hamburg
214 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: ftpgetfile();

  Alt 6. Dez 2011, 05:44
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.

Lg Holger
Holger
Georg Schramm über Lothar Dombrowski:
"Er krankt daran, dass die Leute in einer
schrecklichen Welt leben und lachen..."

_
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: ftpgetfile();

  Alt 6. Dez 2011, 09:13
Und an welcher Stelle deines vorherigen Beitrages sollte ich das rauslesen können?

Zitat:
Und jetzt kommst Du.
Muss ich? Nur mit deinem vorherigen Beitrag, hätte keiner was anfangen können, da bin ich mir ziemlich sicher.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von AirJordan
AirJordan

Registriert seit: 29. Mär 2005
Ort: Hamburg
214 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: ftpgetfile();

  Alt 6. Dez 2011, 10:23
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.

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
Holger
Georg Schramm über Lothar Dombrowski:
"Er krankt daran, dass die Leute in einer
schrecklichen Welt leben und lachen..."

_
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#7

AW: ftpgetfile();

  Alt 6. Dez 2011, 10:38
Werte doch erst einmal die beiden HINTERNET aus. Wenn eins davon 0 ist, dann weiß man ja zumindest schonmal, wo es hakt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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);
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 29. Mär 2005
Ort: Hamburg
214 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: ftpgetfile();

  Alt 6. Dez 2011, 11:31
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, ...) .
Auch ok, habe ich aber auch gemacht. Remote/Localfile String ausgewertet und mir sogar
im ShowMessage anzeigen lassen. Passte alles. Und vertauscht habe ich sie auch nicht.

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

Lg Holger
Holger
Georg Schramm über Lothar Dombrowski:
"Er krankt daran, dass die Leute in einer
schrecklichen Welt leben und lachen..."

_
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: ftpgetfile();

  Alt 6. Dez 2011, 11:36
Auch ok, habe ich aber auch gemacht. Remote/Localfile String ausgewertet und mir sogar
im ShowMessage anzeigen lassen. 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?



... habe ich dann etwas rumprobiert und bin zu einem Funktionsfähigen Ergebnis gekommen.

Delphi-Quellcode:
function getfile(..., localfile, remotefile: string; ...): boolean;
var
  ...
Beispielaufruf:
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.

> draußen die Prameter vertauscht und drinnen nochmal (drinnen vergessen umzudrehn)
> oder die Parameter einfach nur falsch benannt (vergessen umzubenennen)
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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 by Thomas Breitkreuz