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
Seite 1 von 2  1 2      
Bastler

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

ftpgetfile();

  Alt 3. Aug 2007, 16:30
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 ;

Danke!
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
Bastler

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

Re: ftpgetfile();

  Alt 4. Aug 2007, 09: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
Illusion

Registriert seit: 22. Jan 2007
Ort: Maria Wörth
14 Beiträge
 
Delphi 2005 Personal
 
#3

Re: ftpgetfile();

  Alt 5. Aug 2007, 23:23
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
Es kann schon sein das Brote im Gegensatz zu Bananen grüner sind als in der Nacht.
  Mit Zitat antworten Zitat
Benutzerbild von AirJordan
AirJordan

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

AW: Re: ftpgetfile();

  Alt 5. Dez 2011, 19: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
 
#5

AW: ftpgetfile();

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

AW: ftpgetfile();

  Alt 6. Dez 2011, 04: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
 
#7

AW: ftpgetfile();

  Alt 6. Dez 2011, 08: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
 
#8

AW: ftpgetfile();

  Alt 6. Dez 2011, 09: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.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: ftpgetfile();

  Alt 6. Dez 2011, 09: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
43.157 Beiträge
 
Delphi 12 Athens
 
#10

AW: ftpgetfile();

  Alt 6. Dez 2011, 10: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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Dez 2011 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:57 Uhr.
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