AW: Rekursiver Aufruf von FTPFindFirstFile
respekt vor deinen ganzen beiträgen hier im forum.
aber ich hab schon geschaut und an diesem sonntag, wollte ich auch mal etwas faul sein anstatt mich jetzt einige stunden in irgendetwas rein zu lessen, was ich höchstwahrscheinlich nie wieder nutzen werde. deshalb wäre es nett wenn mir jmd etwas nahe bringen könnte. |
AW: Rekursiver Aufruf von FTPFindFirstFile
@momo54321
dafür habe ich volles Verständnis, aber mir geht es genauso ... Die Meldung passt nicht zu Deiner Beschreibung, zum Glaskugeln :glaskugel: fehlt uns heute die Muße ... Wenn Du etwas von Deinem Code (gegf. als Zip) hochlädst kann Dir sicher besser geholfen werden |
AW: Rekursiver Aufruf von FTPFindFirstFile
ich hab eine idftp komponente auf meiner form. ich will nun mittels diesem script ein ordner auf einem ftp server löschen.
da man zum löschen jeden ordner/datei selbst zum löschen anweisen muss, muss ich wissen wo und wieviel ordner/dateien vorhanden sind. hierbei hilft mir dieses script (mehr oder weniger oO ). Nachdem ich dann alles ausgelesen habe würde ich eine löschschleife einbauen. hier ist mein code was dieses script angeht:
Delphi-Quellcode:
procedure ListDir(dir: String; const tv: TTreeView; var tn: TTreeNode);
var itm: TIdFTPListItems; i: Integer; node: TTreeNode; tmp: string; begin Form1.ftp.ChangeDir(dir); Form1.ftp.List; itm := Form1.ftp.DirectoryListing; for i := 0 to itm.count-1 do begin if itm.Items[i].ItemType = ditDirectory then begin node := form1.treeview1.Items.AddChild(tn, itm.Items[i].Filename); listdir(itm.items[i].filename, form1.treeview1, node); Form1.ftp.ChangeDirUp; Form1.ftp.list; itm := Form1 .ftp.DirectoryListing; end else form1.treeview1.Items.addChild(tn, itm.Items[i].filename+' ['+inttostr(itm.items[i].size)+']'); end; end; procedure TForm1.PngSpeedButton1Click(Sender: TObject); var z, z1, z2, zahler: Integer; List : TList; ff : TIdFtpListItems; begin ListDir('/public_html/install2/', Treeview1, Treeview1.Items); // irgendwas passt nicht bez. TTreeNode end; |
AW: Rekursiver Aufruf von FTPFindFirstFile
Delphi-Quellcode:
und dann
procedure ListDir(dir: String; const tv: TTreeView; tn: TTreeNode);
statt //procedure ListDir(dir: String; const tv: TTreeView; var tn: TTreeNode);
Delphi-Quellcode:
// wenn Du schon einen Knoten hast z.B.
ListDir('/public_html/install2/', Treeview1, Treeview1.Items[0]); // wenn Du noch keinen Knoten hast ListDir('/public_html/install2/', Treeview1, nil); außerdem alle form1.treeview1. in der Prozedur durch tv. ersetzen .... |
AW: Rekursiver Aufruf von FTPFindFirstFile
startbar ist es nun
aber nun hängt er in einer endlosscheife fest. ich glaube die änderungen sind nicht richtungsweisend, da in posting #5, eigentlich von beginn an alles funktionierte. showmessage hinzugefügt, um zu testen: die 2 showmessage's werden immer wieder aufgerufen...
Delphi-Quellcode:
procedure ListDir(dir: String; const tv: TTreeView; tn: TTreeNode);
var itm: TIdFTPListItems; i: Integer; node: TTreeNode; tmp: string; begin Form1.ftp.ChangeDir(dir); Form1.ftp.List; itm := Form1.ftp.DirectoryListing; for i := 0 to itm.count-1 do begin showmessage(InttoStr(itm.count-1)); // Showmessage if itm.Items[i].ItemType = ditDirectory then begin if (itm.Items[i].Filename <> '.') or (itm.Items[i].Filename <> '0') then begin node := tv.Items.AddChild(tn, itm.Items[i].Filename); showmessage(itm.Items[i].Filename + ' / L: ' + IntToStr(Length(itm.Items[i].Filename))); // Showmessage listdir(itm.items[i].filename, tv, node); Form1.ftp.ChangeDirUp; Form1.ftp.list; itm := Form1.ftp.DirectoryListing; end; end else form1.treeview1.Items.addChild(tn, itm.Items[i].filename+' ['+inttostr(itm.items[i].size)+']'); end; end; |
AW: Rekursiver Aufruf von FTPFindFirstFile
Ich weiß nicht was daran so schwer ist, mal kurz selber in die OH zu schauen? Das wäre schneller gegangen, als hier zu fragen und andere erst nachsehn lassen zu müssen.
In deiner Funktion findest du, daß dieses aNode an AddChildObject übergeben wird und da kann man nachlesen, daß man für NIL angeben kann/muß, wenn man zum Beispiel den Rootknoten haben möchte, bzw. einen Hauptknoten erstellen will. Beim TTreeView gibt man NIL an, wärend man z.B. beim VirtualTreeView das RootNode-Property verwendet, wenn ich mich richtig erinnere. Und genau dafür gibt es Tutorials und die OH. :roll: |
AW: Rekursiver Aufruf von FTPFindFirstFile
das angeben von nil geht allerdings auch nur wenn man im proceduren kopf das var entfernt.
nil hatte ich ja schon ausprobiert und es ging nicht, siehe Fehler:
Delphi-Quellcode:
[DCC Error] Unit1.pas(1837): E2033 Types of actual and formal var parameters must be identical
also, so funktioniert der kram zumindest bei mir nun:
Delphi-Quellcode:
procedure ListDir(dir: String; const tv: TTreeView; tn: TTreeNode);
var itm: TIdFTPListItems; i: Integer; node: TTreeNode; tmp: string; begin Form1.ftp.ChangeDir(dir); Form1.ftp.List; itm := Form1.ftp.DirectoryListing; for i := 0 to itm.count-1 do begin //showmessage(InttoStr(itm.count-1)); // Showmessage if itm.Items[i].ItemType = ditDirectory then begin if itm.Items[i].Filename <> '.' then begin node := tv.Items.AddChild(tn, itm.Items[i].Filename); //showmessage(itm.Items[i].Filename + ' / L: ' + IntToStr(Length(itm.Items[i].Filename))); // Showmessage listdir(itm.items[i].filename, tv, node); Form1.ftp.ChangeDirUp; Form1.ftp.list; itm := Form1.ftp.DirectoryListing; end; end else form1.treeview1.Items.addChild(tn, itm.Items[i].filename+' ['+inttostr(itm.items[i].size)+']'); end; end; procedure TForm1.PngSpeedButton1Click(Sender: TObject); begin FTP.Host := FTP.Text; FTP.Port := StrToInt(FTPport.Text); FTP.Username := FTPlogin.Text; FTP.Password := FTPpw.Text; FTP.Connect; ListDir('/public_html/install2/', Treeview1, nil); FTP.Disconnect; end; |
AW: Rekursiver Aufruf von FTPFindFirstFile
Jupp, das VAR ist dort sowieso falsch.
Ich war aber eh von dem ursprünglichen
Delphi-Quellcode:
ausgegangen.
procedure TForm1.FindFilesTree(aTree: tTreeView; aPath: string; aNode: tTreeNode; aWithFiles: boolean);
|
AW: Rekursiver Aufruf von FTPFindFirstFile
Bei dem Auflisten eines Verzeichnis über FTP muss man richtig vorgehen.
FTP Zugriffe sind teuer da sie über das Netzwerk gehen und dementsprechend viel Zeit brauchen. Daher muss die Strategie so aussehen: Verzeichnis mit "List" abrufen und alle Dateien in den Tree eintragen. Unterverzeichnisse werden in diesem 1. Durchlauf ignoriert. In einem 2. Durchlauf durch ftp.DirectoryListing werden alle Unterverzeichnisse rekursiv besucht. Ein erneutes Auflisten des aktuellen Verzeichnis ist dabei unnötig und muss unbedingt vermieden werden!! Sehr zu empfehlen ist auch die Übergabe einer Rekursionstiefe:
Delphi-Quellcode:
Möchte man nur das Basisverzeichnis auflisten übergibt man für "level" den Wert 1;
procedure ListDir(dir: String; const tv: TTreeView; tn: TTreeNode; level:integer);
begin if level <= 0 then Exit; ... // und später der rekursive Aufruf listdir(itm.items[i].filename, tv, node, level - 1); ... um alle Unterverzeichnisse aufzulisten übergibt man einen Wert > 100. Das sollte für alle "normalen" FTP Server ausreichen. Bei einem unbekannten FTP-Server könnte man mit level=2 beginnen, damit man sich nicht in den möglichweise Tausenden Unterverzeichnissen verliert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 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