Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Verbindung zum FTP-Server über mehrere Prozeduren hinweg (https://www.delphipraxis.net/142509-verbindung-zum-ftp-server-ueber-mehrere-prozeduren-hinweg.html)

Samufi 29. Okt 2009 14:35


Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Hallo,
ich schreibe gerade an einem Programm, das sehr häufig kontakt zu einem ftp-Server aufnimmt und Dateien hoch- und runterlädt. Dazu benutzte ich bisher immer folgende Funktionen:
Delphi-Quellcode:
function TForm1.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;

function TForm1.getfile(server, username, password, remotefile, localfile: 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(remotefile), pchar(localfile), false, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_ASCII,0);
  InternetCloseHandle(hconnect);
end;
Nun dachte ich mir, dass es doch evtl. viel Zeit sparen würde, wenn man nicht jedesmal neu eine Verbindung zum Server aufnimmt und diese dann schließt (das kam mehrmals während einer Prozedur vor), sondern zum Programmstart die Verbindung eingeht und zum Ende diese wieder schließt. Dazu wollte ich dann hconnect global definieren, damit dann beim ftpputfile darauf zugegriffen werden kann. Vielleicht ist dieser Gedankengang etwas dilettantisch, ich kenne mich mit der Materie halt nicht so gut aus. Auf jeden Fall hat das so nicht hingehauen - ich nehme an, ich habe da einen groben Denkfehler drin.
Hat vielleicht jemand von euch eine Idee, wie ich das richtigmachen könnte - bzw. kann mir jemand sagen, ob das überhaupt geht?
Allen Antwortern schon mal vielen Dank im Vorraus!
Samufi

stho 29. Okt 2009 14:40

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
wenn du verbunden bist bist du verbunden ^^ nach ner procedure wird die verbindung net unterbrochen außer vom FTP aus wegen inaktivität.

bau doch ne abfrage hinein mit "if not FTP.Connected then" und rufst nur dann eine procedure auf ^^

Samufi 29. Okt 2009 15:00

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Danke für die Antwort!
Aber was setze ich dann für hconnect ein? Das müsste ich dann doch global definieren oder nicht?! Bisher hats noch nicht funktioniert (vielleicht stelle ich mich auch beim globalen definieren falsch an...) Muss ichs überhaupt global definieren, wenn ja, wie mache ich das richtig?

shmia 29. Okt 2009 15:21

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Du solltest sämtlichen Code, der für den Zugriff auf den FTP-Server zuständig ist in einer Klasse kapseln.
Dein Formular legt dann ein Objekt dieser Klasse an, öffnet zu Beginn den FTP-Server und
kann dann über die bestehende Verbindung bequem Dateien hoch- und runterladen.

Du hast Glück, denn ich habe so eine Klasse schon vor längerer Zeit geschrieben. :angel:
http://www.delphipraxis.net/internal...ct.php?t=26504

PS: globale Handles sind Mist! Kapseln in Klassen ist der saubere Weg

Samufi 29. Okt 2009 15:36

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Hmmm, ich hab jetzt dein InetTools eingebunden, aber ich hab irgendwie noch keinen Plan, wie ich damit jetzt umgehe. Könntest du mir vielleicht ein ungefähres Beispiel für den Quellcode geben, mit dem ich das hconnect global zugänglich machen kann? (Vielleicht hab bin ich immer noch auf dem falschen Dampfer... :gruebel: )

shmia 29. Okt 2009 15:47

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Es ist ein Beispielprojekt dabei, in dem alle Methoden demonstriert werden.
Du brauchst dich um keine Handles mehr zu kümmern.
Aber mal so als Kurzeinstieg:
1.) Objekt im Formular deklarieren
Delphi-Quellcode:
  uses ...., InetTools;

  TForm1 = class(TForm)
  ....
  private
    { Private-Deklarationen }
    ftp : TInetFTP;
  ..
  end;
2.) Objekt erzeugen (und zerstören)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   ftp := TInetFTP.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
   ftp.Free;
end;
3.) FTP-Server (einmalig) öffnen
Delphi-Quellcode:
ftp.Server  := 'ftp.wasauchimmer.com'
ftp.User    := 'anonymous';
ftp.Password := 'egal';
ftp.Connect(True);
4.) Dateien hoch- und runterladen
Delphi-Quellcode:
ftp.GetFile('testfile.txt', 'C:\testfile.txt'); // download
ftp.PutFile('C:\autoexec.bat', 'a.bat'); // upload

Samufi 29. Okt 2009 15:49

Re: Verbindung zum FTP-Server über mehrere Prozeduren hinweg
 
Vielen Dank!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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