Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idFTP Ordner rekursiv auflisten (https://www.delphipraxis.net/123502-idftp-ordner-rekursiv-auflisten.html)

MorphieX 3. Nov 2008 13:07


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:
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;
Ich rufe das ganze dann mittels
Delphi-Quellcode:
auflisten(nil);
auf.

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:
current:=TreeView1.Items.AddChild(CurrentNode,l.Items[i].FileName); // < hier knallts!
schreibe, kommt ein Fehler:
---------------------------
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:
var
l: TIdFtpListItems;
global deklariert, ist es aber nicht! (verhält sich aber eben so)

Hoffe ich konnte mein Problem etwas plausibel darstellen... Ich versteh es ja selbst nicht so ganz ;-)

jfheins 3. Nov 2008 14:27

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); // &lt; Hier wird auflisten rekursiv aufgerufen
      idftp1.ChangeDirUp;
    end;
  end;
end;

MorphieX 3. Nov 2008 15:10

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? ;-)

jfheins 3. Nov 2008 15:23

Re: idFTP Ordner rekursiv auflisten
 
Kannst du, ist aber ineffizienter als die zweite Lösung ;)

Delphi-Quellcode:
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); // &lt; Hier wird auflisten rekursiv aufgerufen
    idftp1.ChangeDirUp;
  end;
  dirs.Free;
end;
Versuch das mal so ;)


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