![]() |
idFTP Ordner rekursiv auflisten
Hallo liebe DPer!
Ich versuche die gesamte Verzeichnisstruktur eines FTP Servers rekursiv auszulesen und anschließend in eine TreeView einzutragen. Mein Code sieht so aus:
Delphi-Quellcode:
Ich rufe das ganze dann mittels
procedure TForm1.auflisten(CurrentNode: TTreeNode);
var i: integer; l: TIdFtpListItems; current: TTreeNode; begin idftp1.List(nil,'',true); l:=idftp1.DirectoryListing; for i := 0 to l.Count-1 do begin current:=TreeView1.Items.AddChild(CurrentNode,l.Items[i].FileName); // < hier knallts! current.ImageIndex:=-1; if (l.Items[i].ItemType=ditDirectory) then begin current.ImageIndex:=0; idftp1.changedir(l.Items[i].FileName); auflisten(current); // < Hier wird auflisten rekursiv aufgerufen idftp1.ChangeDirUp; end; end; end;
Delphi-Quellcode:
auf.
auflisten(nil);
Sobald der erste rekursive durchlauf beendet wird, nimmt l.count jedoch die Anzahl der zuvor aufgerufenen liste an. Beispiel: 1. root (l.count = 3) 2. --html (l.count = 2) 3. ----testprojekt (l.count = 0) 4. ----forum (l.count = 0) 5. --backup (l.count = 1) 6. ----heute (l.count = 0) 7. --temp (l.count = 0) So sollte es aussehen. Es sieht aber so aus: 1. root (l.count = 3) 2. --html (l.count = 2) 3. ----testprojekt (l.count = 2) 4. ----forum (l.count = 2) 5. --backup (l.count = 2) 6. ----heute (l.count = 2) 7. --temp (l.count = 2) wenn ich jetzt
Delphi-Quellcode:
schreibe, kommt ein Fehler:
current:=TreeView1.Items.AddChild(CurrentNode,l.Items[i].FileName); // < hier knallts!
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse EListError mit der Meldung 'Listenindex überschreitet das Maximum (3)' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Die Fehlermeldung ist nicht mit dem Beispiel kompatibel (Nur, falls sich jemand über Listenindex 3 wundert) Hat da jemand ne Idee, woran das liegen könnte? Oder besser: wie kann man das beheben / umgehen??? Es kommt mir so vor, als wär
Delphi-Quellcode:
global deklariert, ist es aber nicht! (verhält sich aber eben so)
var
l: TIdFtpListItems; Hoffe ich konnte mein Problem etwas plausibel darstellen... Ich versteh es ja selbst nicht so ganz ;-) |
Re: idFTP Ordner rekursiv auflisten
Ist es doch ;)
Den hier: l:=idftp1.DirectoryListing; "merkst" du dir zwar, wo dein Listing ist, kopierst es aber nicht ;) d.h. sobald du auf ein Verzeichnis stößt, ruft dieses wieder idftp.list auf und überschreibt damit dein Listing der aufrufenden Funktion. Lösung 1: Kopieren. Also alle namen in eine Streingliste kopiren, und durch diese iterieren. Lösung 2: Du tust erstmal alles ins Treeview und gehst dann nochmal durch die Liste und ruft für die Ordner die Funktion nochmal auf. Also sowas in der Art:
Delphi-Quellcode:
procedure TForm1.auflisten(CurrentNode: TTreeNode);
var i: integer; l: TIdFtpListItems; current: TTreeNode; begin idftp1.List(nil,'',true); l:=idftp1.DirectoryListing; for i := 0 to l.Count-1 do begin current:=TreeView1.Items.AddChild(CurrentNode,l.Items[i].FileName); if (l.Items[i].ItemType=ditDirectory) then current.ImageIndex:=0; else current.ImageIndex:=-1; end; for i := 0 to l.Count-1 do begin // current zuweisen if (l.Items[i].ItemType=ditDirectory) then begin idftp1.changedir(l.Items[i].FileName); auflisten(current); // < Hier wird auflisten rekursiv aufgerufen idftp1.ChangeDirUp; end; end; end; |
Re: idFTP Ordner rekursiv auflisten
Vielen vielen Dank!!!
Aber kann ich das DirectoryListing nicht irgendwie "kopieren"? So, dass es nur für den aktuellen Durchlauf gilt? Wenn ja, wie? ;-) |
Re: idFTP Ordner rekursiv auflisten
Kannst du, ist aber ineffizienter als die zweite Lösung ;)
Delphi-Quellcode:
Versuch das mal so ;)
procedure TForm1.auflisten(CurrentNode: TTreeNode);
var i: integer; l: TIdFtpListItems; dirs: TStringList; current: TTreeNode; begin dirs := TStringList.Create(); idftp1.List(nil,'',true); l:=idftp1.DirectoryListing; for i := 0 to l.Count-1 do begin current:=TreeView1.Items.AddChild(CurrentNode,l.Items[i].FileName); if (l.Items[i].ItemType=ditDirectory) then begin current.ImageIndex:=0; dirs.addObject(l.Items[i].FileName, current); end; else current.ImageIndex:=-1; end; for i := 0 to dirs.count - 1 do begin idftp1.changedir(dirs[i]); auflisten(dirs.objects[i] as TTreeNode); // < Hier wird auflisten rekursiv aufgerufen idftp1.ChangeDirUp; end; dirs.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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