Entwickler-Ecke

Internet / Netzwerk - Verzeichnis vom FTP-Server mit Indy-FTP kopieren


tastenkleber - Fr 21.08.15 00:18
Titel: Verzeichnis vom FTP-Server mit Indy-FTP kopieren
Guten Abend,

ich möchte per FTP ein komplettes Verzeichnis von meinem FTP-Server auf meinen PC laden.
Zu diesem Thema gibt es bereits zahlreiche Threads und Codebeispiele, die allesamt für mich auch verständlich und nachvollziehbar sind – nur bei mir klappt es trotzdem nicht. An dem Punkt, wo idFTP1.DirectoryListing.Count = 0 ist, muß ich leider kapitulieren. Damit ihr versteht, was ich meine, hier ein Code-Ausschnitt:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;myLocalDirectory : string;
begin
  myLocalDirectory := 'D:\Test\musik\';
  with idFTP1 do begin
    Host :='xyz.de';
    Port := 21;
    Username := 'abc123';
    Password := '******';
    Passive  := True;
  end;

 try
  idFTP1.Connect;
 except
  on E:Exception do
  begin
   MessageDlg(E.Message, mtError, [mbOk], 0);
   idFTP1.Disconnect;
   exit;
  end;
 end;

 if idFTP1.Connected then
 begin
   idFTP1.ChangeDir('html/downloads/musik');
   showmessage(idFTP1.GetNamePath);// Es wird das o.a. Verzeichnis angezeigt (klappt also schonmal).
   // dort sind 7 Dateien und 3 Verzeichnisse enthalten.
   idFTP1.List;
   showmessage(IntToStr(idFTP1.ListResult.count)); // Ergebnis = 10 -> 7 Dateien und 3 Verzeichnisse (klappt auch!)
   showmessage(IntToStr(idFTP1.DirectoryListing.Count)); // Ergebnis = 0 (warum = 0 ??)
 end;
// wegen DirectoryListing.count = 0 brauch ich erst gar nicht weiter zu machen...

{ das würde dann in etwa so aussehen:}
  for i :=0 to idFTP1.DirectoryListing.Count-1 do
  begin
    if idFTP1.DirectoryListing[i].ItemType = ditFile then // die Dateien kopieren
      idFTP1.Get(idFTP1.DirectoryListing[i].FileName, myLocalDirectory + idFTP1.DirectoryListing[i].FileName);   
   // dann die Verzeichnisse rekursiv
    if idFTP1.DirectoryListing[i].ItemType = ditDirectory then;//... usw
    
  end

  idFTP1.disconnect;
end;



Wer kann mir hier weiterhelfen oder mir wenigstens erklären, warum idFTP1.DirectoryListing.count = 0 ist, obwohl
idFTP1 verbunden ist und mit GetNamePath und ListResult.Count richtige Ergebnisse zeigt?


mandras - Fr 21.08.15 00:30

vielleicht hilft

http://www.delphipraxis.net/55331-idftp-directorylisting.html

Eintrag Nr. 6


tastenkleber - Fr 21.08.15 01:37

vielen Dank, Volltreffer.
Die Lösung war: Unit "IdAllFTPListParsers" musste eingebunden werden.

Hier noch ein Hinweis: bei

Delphi-Quelltext
1:
idFTP1.Get(idFTP1.DirectoryListing[i].FileName, myFolder,True);                    

musste ich den letzten Wert (True) setzen. Ohne diesen Werte erhielt ich immer den Fehler "file already exists".