Entwickler-Ecke
Internet / Netzwerk - Problem bei IdFTP.DirectoryListing
FSS - Mo 01.01.07 19:03
Titel: Problem bei IdFTP.DirectoryListing
Hallo,
ich lese über IdFTP1.List(ListBox1.Items, '' , false) denn Inhalt eines FTPServers in eine Listbox ein. Funktioniert wunderbar. Nun sollen Ordner oder Dateien vom Server gelöscht werden. Dazu kann der Anwender in der Lisbox einen Eintrag markieren und auf einen Button klicken, das Programm stellt fest, ob es sich bei dem Eintrag um einen Ordner oder eine Datei handelt und löscht es dann. Genau bei dieser Afrage liegt das Problem:
Delphi-Quelltext
1: 2: 3: 4: 5:
| if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditDirectory then begin IdFTP1.RemoveDir(Self.ListBox1.Items.Strings[Self.ListBox1.Itemindex]); end else if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditFile then begin IdFTP1.Delete(Self.ListBox1.Items.Strings[Self.ListBox1.Itemindex]); end; |
In der ersten Zeile bekomme ich den Fehler "Listenindex überschreitet das Maximum", in Klammern gibt er noch die Zahl des markierten Eintrages in der Listbox an.
Weiß jemand was hier schief läuft?
IngoD7 - Mo 01.01.07 19:54
Ich habe mich offen gestanden recht lange nicht mehr mit TIdFTP befasst. Bin also auch etwas unsicher.
Wofür genau hast du in der zweiten Zeile das self? Und warum in der ersten Zeile nicht?
FSS - Mo 01.01.07 20:01
Wenn der Anwender in der Listbox einen Eintrag wählt, sehe Ich ja über ItemIndex welchen Eintrag er gewählt hat. Da die Einträge in der Listbox und in IdFTP1.DirectoryListing (meines Wissens nach) übereinstimmen müssten, lasse ich prüfen, ob das gewählte Objekt ein Ordner oder eine Datei ist.
In der zweiten Zeile hole ich mir dann den Namen des Objektes und lösche es.
IngoD7 - Mo 01.01.07 20:06
Ääähm ... nochmal ... :wink:
Meine Frage war:
Warum verwendest du mal Self.Listbox1 und mal "nur" Listbox1, um auf die Listbox zuzugreifen?
FSS - Mo 01.01.07 20:55
Ach jetzt, versteh ich was du meinst. Geht ohne Self auch, den Teil habe ich aus einem älteren Programm übernommen.
Das hat in diesem fall aber keine Auswirkungen.
IngoD7 - Mo 01.01.07 21:12
Okay. :)
Dann ans Eingemachte:
Zunächstmal wirft die Kiste (Indy 9.0.14) bei mir eine Exception, wenn ich
Delphi-Quelltext
1:
| if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditDirectory then |
abfragen will ohne die List-Methode zuvor mit
true aufgerufen zu haben.
Also so müsste es m.E. sein:
Delphi-Quelltext
1:
| IdFTP1.List(ListBox1.Items,'',true) |
Mit
false, so wie du es gemacht hast, lädt er die ganzen File-Attribute gar nicht erst mit runter, sondern im Prinzip nur die Filenamen.
So klappt es bei mir jetzt jedenfalls alles anstandslos.
Warum er bei dir scheinbar mit dem Index nicht einverstanden ist, kann ich so nicht sagen.
Hat zwischendurch bei dir vielleicht die Liste
Items in
IdFTP.DirectoryListing ihren Inhalt verloren?
Das würde ich mal überprüfen.
FSS - Mo 01.01.07 21:39
Ich schaue mir das jetzt noch mal in aller Ruhe an. Danke erstmal!
FSS - Di 02.01.07 19:51
Hab jetzt was gefunden!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var anzahl : Integer; begin IdFTP1.List(ListBox1.Items, '' , true); anzahl := IdFTP1.DirectoryListing.Count; ShowMessage(IntToStr(anzahl)); end; |
Hier bekommen ich als Message immer die Zahl 0, in DirectoryListing scheinen keine Items zu sein. Ich habe aber keine Ahnung, woran das liegt!
IngoD7 - Di 02.01.07 20:29
FSS hat folgendes geschrieben: |
Hab jetzt was gefunden!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var anzahl : Integer; begin IdFTP1.List(ListBox1.Items, '' , true); anzahl := IdFTP1.DirectoryListing.Count; ShowMessage(IntToStr(anzahl)); end; |
Hier bekommen ich als Message immer die Zahl 0, in DirectoryListing scheinen keine Items zu sein. Ich habe aber keine Ahnung, woran das liegt! |
Aber in der Listbox1 steht was drin?
Welche Version der Indy-Komponenten hast du?
FSS - Di 02.01.07 20:49
In der Listbox steht was drin, ich verwende die Version 10.0.52.
IngoD7 - Di 02.01.07 21:24
Mal vorausgesetzt die Indys, die du verwendest, sind fehlerfrei, dann musst du mal sämtliche Eigenschaften der Komponente durchkauen und schauen, wie sie gesetzt sind und ob sie vielleicht das Verhalten der Komponente entsprechend beeinflussen.
Auch werden z.B. beim Befehl STATUS (ebenso wie bei LIST) die DirectoyListing-Items zuvor gelöscht. Soll heißen: Wenn vielleicht zwischen deinem LIST-Befehl und der Abfrage von DirectoryListing zuviele andere Dinge geschehen, könnten diese vielleicht die DirectoryListing killen.
Anders herum:
Wenn du - wie in deinem letzten Code angegeben - direkt nach dem LIST die Abfrage machst, darf DirectoryListing nicht leer sein. Es sei denn irgendwelche Einstellungen/Eigenschaften veranlassen die Komponente zu solch ungewünschtem Verhalten.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!