Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi INDY ftp.list problem (https://www.delphipraxis.net/145759-indy-ftp-list-problem.html)

marteng57 7. Jan 2010 22:56


INDY ftp.list problem
 
Hallo,

wollte (in D 2009) mal schnell einen ftp-Zugriff realisieren und stehe auf dem Schlauch

Delphi-Quellcode:
  tOrders := TStringList.Create;
  IdFTP1.Connect;
  if IdFTP1.Connected then
  begin
    IdFTP1.ChangeDir('/IN');
    try
      IdFTP1.List(tOrders);
    except
      // Fehlerbehandlung
    end;
  end;
Tja und tOrders ist immer leer.
Die Analyse sagt dass ich auf Connetion Closed Gracefully stosse, das Verzeichnis enthält aber Dateien und im filezilla geht es ohne Probleme
Wieso geht die Connection flöten oder was sehe ich nicht?

Danke für Eure Hilfe

Assertor 8. Jan 2010 08:11

Re: INDY ftp.list problem
 
Hallo Martin,

Zitat:

Zitat von marteng57
Tja und tOrders ist immer leer.
Die Analyse sagt dass ich auf Connetion Closed Gracefully stosse, das Verzeichnis enthält aber Dateien und im filezilla geht es ohne Probleme
Wieso geht die Connection flöten oder was sehe ich nicht?

Hmm, davon höre ich das erste mal. Was für ein Server ist denn die Gegenstelle, irgendwas exotisches? Binde sonst mal bitte IdAllFTPListParsers in die Unit ein. Ich nutze z.B. FTP auch mit D2009 und D2010, .List ging sowohl mit der Release Version als auch der aktuellen SVN Version...

Kannst Du auch mal per Netzwerk Sniffer (SmartSnif, Wireshark o.ä.) gucken, was passiert?

Gruß Assertor

Klaus01 8. Jan 2010 08:39

Re: INDY ftp.list problem
 
Guten Morgen,

und die Zugangsdaten (Username, Passwort) stimmen?

Grüße
Klaus

GHorn 8. Jan 2010 08:44

Re: INDY ftp.list problem
 
Hi,

wie ich das sehe gibt es von List in IdFTP.PAS zwei überladene Funktionen:

Delphi-Quellcode:
procedure TIdFTP.List;
begin
  List(nil);
end;

procedure TIdFTP.List(const ASpecifier: string; ADetails: Boolean);
begin
  List(nil, ASpecifier, ADetails);
end;


Ich habe das so gemacht um eine Datei einzulesen (D2009):

Delphi-Quellcode:
var
  TFS: TFileStream;
begin
  TFS := TFileStream.Create(cFTPSupplierFile, fmCreate);
  try
    // Verbinden:
    try
      IdFTP1.Connect;
      Application.ProcessMessages;
      IdFTP1.List;
      IdFTP1.Get(cMyFile, TFS, False);
      TFS.Seek(0, soFromBeginning);  // an den Anfang setzen
      .....
    except
      Result := False;
    end;
  finally
    ....
  end;
end;

Um ein Verzeichnis einzulesen, schau Dir mal die Property "ListResult" an.

Gruß
Gerald

marteng57 8. Jan 2010 08:54

Re: INDY ftp.list problem
 
Hallo,

vielen Dank für die Hinweise.

@Klaus: Die Zugangsdaten stimmen, der Connect läuft sauber, auch der Wechsel der Verzeichnisse, kann ich auch über retrieveDir oder so anzeigen lassen

@Assertor: die IdAllFTPListParsers habe ich eingebunden, keine Änderung des Verhaltens

@Gerald: auch ListResults liefert keine Ergebnisse

Für mich sieht es so aus, als ob durch die Listanfrage die Connection geschlossen würde, die Art des Servers kenne ich nicht. Es ist der Zugang eines Dienstleisters zur Übertragung von EANCOM Daten und es gibt viele andere User die offensichtlich kein Problem haben.

Gruß
Martin

Klaus01 8. Jan 2010 09:07

Re: INDY ftp.list problem
 
Hallo Martin,

bekommst Du die Exception nur zu sehen,
wenn Du Dein Programm in der IDE laufen lässt?
Wie schaut es es aus, wenn Du es ausserhalb der IDE startest.

Hier noch ein Thread mit ähnlichem Thema.

Grüße
Klaus

marteng57 8. Jan 2010 09:37

Re: INDY ftp.list problem
 
Klaus, danke für den Hinweis.

Die Sache mit dem Debugger hatte ich schon gesehen, steht ja auch in der Source von Indy gut beschrieben drin.
Dein Verweis auf den anderen Thread entnehme ich, dass es sehr wohl ein Problem der Gegenseite sein könnte.
Meine Erkundungen haben ergeben dass auf der Gegenseite ein Filezilla-Server sitzt, leider ist der dafür Zuständige erkrankt.

Gruß
Martin

marteng57 8. Jan 2010 18:49

Re: INDY ftp.list problem
 
:duck:

Auch ein anderer Server reagiert gleich.

Wer schafft es mit Delphi 2009 ein Verzeichnis eines FTP-Servers auszulesen?

Wäre für jeden Hinweis dankbar.

Gruß
Martin

marteng57 8. Jan 2010 19:42

Re: INDY ftp.list problem
 
Hallo,

noch ein Hinweis,

das Abholen einer Datei mittels ftp.Get funktioniert einwandfrei.

Es ist also kein Zugangsthema oder so. Lediglich das Abrufen der überhaupt im Verzeichnis vorhandenen Dateien funktioniert in keinster Weise.
Nutzt das denn niemand? Es scheint mir wirklich ein Problem von Indy zu sein. :wall:

Gruß
Martin

Morphie 8. Jan 2010 20:55

Re: INDY ftp.list problem
 
Also ich kann ohne Probleme mit Delphi 2009 ein List ausführen...
Liegt dein Fehler vielleicht in dem Slash beim Changedir?
IdFTP1.ChangeDir('/IN');

also beim code (einfach so dahin geklatscht, keine Fehlerbehandlung) sieht so aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: TStringList;
  i: integer;
begin
  s:=TStringList.Create;
  idftp1.Connect;
  idftp1.ChangeDir('html');
  idftp1.List(s);
  for i := 0 to s.Count - 1 do
  begin
    showmessage(s[i]);
  end;

end;
Edit:
FTP Server: vsFTPd 2.0.7
Zielsystem: Debian

Edit2: ich benutze übrigends die Indy 10.2.5

Luckie 8. Jan 2010 21:00

Re: INDY ftp.list problem
 
Hast du die nötigen Rechte, um die Dateien aufzulisten? Funktioniert es mit einem anderen FTP-Client?

Morphie 8. Jan 2010 21:01

Re: INDY ftp.list problem
 
Das hat er ja bereits schon im 1. Post geschrieben
Zitat:

das Verzeichnis enthält aber Dateien und im filezilla geht es ohne Probleme

Luckie 8. Jan 2010 21:02

Re: INDY ftp.list problem
 
Ok, überlesen.

marteng57 8. Jan 2010 21:17

Re: INDY ftp.list problem
 
Danke für die Hinweise,

es muss definitiv am List liegen, ich habe auch auf der Indy-Projectsite einen Hinweis gefunden, dass der List-Befehl in Version 10 ganz neu implementiert wurde.
Dafür gibt es jetzt einen Parser mit vielen verschiedenen Listformaten.
Es ist mir aber nicht klar, welches er zieht, offensichtlich gibt es da in den neueren Versionen auch verbesserungen. Ich habe noch die Originalversion von D 2009 (Wo kann man diese Versionsnummer denn auslesen?)

Werde mal versuchen auf die neueste Version upzudaten.

Gruß
Martin

Morphie 8. Jan 2010 21:25

Re: INDY ftp.list problem
 
Zitat:

Ich habe noch die Originalversion von D 2009 (Wo kann man diese Versionsnummer denn auslesen?)
diese müsste ich eigentlich auch haben...
Rechtsklick auf die idftp Komponente, dann steht dort ein entsprechender Hinweis im Popup Menü.

marteng57 8. Jan 2010 21:33

Re: INDY ftp.list problem
 
Danke, ja ich habe auch die 10.2.5 und trotzdem bekomme ich nie etwas zurückgeliefert.
Die Variable TStrings bleibt immer leer und der Hinweis in der Indy-Source besagt, dass die Connection geschlossen wurde.
Und mit Filezilla geht es aber wunderbar....

Gruß
Martin

Luckie 8. Jan 2010 21:34

Re: INDY ftp.list problem
 
Versuch mal rauszubekommen, was für eine Software auf dem Server läuft.

Morphie 8. Jan 2010 21:38

Re: INDY ftp.list problem
 
ich könnte dir ja mal einen zugang zu meinem ftp server einrichten, damit du schauen kannst, ob es tatsächlich am server liegt, oder an deinem code...
wenn interesse besteht, melde dich einfach per pn

marteng57 8. Jan 2010 21:39

Re: INDY ftp.list problem
 
Nach meiner Info Filezilla als Server,

aber auch ein anderer FTP-Server unter Windows IIS geht nicht.

Gruß
Martin

jfheins 8. Jan 2010 23:16

Re: INDY ftp.list problem
 
Hmmm ...

Ich habs bis jetzt ungefähr so gemacht:
Delphi-Quellcode:
FFtp.SendCmd('TYPE A');
    FFtp.List (nil, '-a', True);
    for i := 0 to FFtp.ListResult.Count - 1 do
      // Mach was mit FFtp.ListResult[i]
Das -a sorgt dafür, dass auch versteckte Dateien angezeigt werden.

Morphie 8. Jan 2010 23:32

Re: INDY ftp.list problem
 
also wir haben bereits herausgefunden, dass -wenn man eine stringliste als paramter übergibt- diese stringliste als TStringList deklariert sein muss und nicht als TStrings. Bei TStrings scheint es zu krachen...

Assertor 9. Jan 2010 10:08

Re: INDY ftp.list problem
 
Hallo Martin,

Zitat:

Zitat von marteng57
es muss definitiv am List liegen, ich habe auch auf der Indy-Projectsite einen Hinweis gefunden, dass der List-Befehl in Version 10 ganz neu implementiert wurde. Dafür gibt es jetzt einen Parser mit vielen verschiedenen Listformaten. Es ist mir aber nicht klar, welches er zieht, offensichtlich gibt es da in den neueren Versionen auch verbesserungen. Ich habe noch die Originalversion von D 2009 (Wo kann man diese Versionsnummer denn auslesen?)

Werde mal versuchen auf die neueste Version upzudaten.

Ich habe es gerade mal mit einer frischen D2009 Installation für Dich getestet: Es funktioniert bei mir.

Testcode:
Delphi-Quellcode:
IdFTP1.Host := 'ftp.**.de'; // mein FTP Server
IdFTP1.Username := '**'; // ...
IdFTP1.Password := '**'; // ...
IdFTP1.Connect;
IdFTP1.List;
ShowMessage(IdFTP1.ListResult.Text);
Also nur ein leeres VCL Projekt mit dem IdFTP.

Die Info auf den meisten Indy Seiten ist mangels Betreuer veraltet. Indy 10 ist ja nun schon ein paar Järchen da...

Deshalb meine Bitte nochmal: Teste mal bitte mit einem Protokoll/Netzwerk-Sniffer, was bei Dir passiert. Ob eine lokale Firewall o.ä. da im Weg steht, vielleicht auch ein NAT-Router. Ohne Analyse des Netzwerkverkehrs wirst Du da nicht weiterkommen!

Viele Grüße,

Assertor

Assertor 9. Jan 2010 10:20

Re: INDY ftp.list problem
 
Hallo Morphie,

Zitat:

Zitat von Morphie
also wir haben bereits herausgefunden, dass -wenn man eine stringliste als paramter übergibt- diese stringliste als TStringList deklariert sein muss und nicht als TStrings. Bei TStrings scheint es zu krachen...

:shock: TStrings ist doch auch die abstrakte Basisklasse von Delphi für StringListen, das kann also nicht gehen...

Gruß Assertor

marteng57 9. Jan 2010 11:45

Re: INDY ftp.list problem
 
Hallo,

das Problem ist gelöst, auch wenn ich nicht mehr ganz genau sagen kann, auf welchem Wege.
Es war wohl eine Kombination aus benötigtem passive Modus, firewall und ....

idfp.list funktioniert im Übrigen sowohl mit TStrings als auch mit Tstringlist.
Nur wenn das Ergebnis über ListResult abgeholt wird ist TStrings zwingend.

Dafür scheint die überladene Definition von List mit Filter und Details nicht zu greifen, es kommt immer das Gesamtergebnis. Aber das ist nicht schlimm, ich kann es ja nachher filtern.

Vielen Dank für die Hilfe, insbesondere an morphie.

Danke und Gruß :hi:
Martin

SirThornberry 9. Jan 2010 12:08

Re: INDY ftp.list problem
 
Es sollte definitiv ein Nachfahre von TStrings sein um zu verhindern das es kracht. Denn TStrings ist eine Basisklasse mit recht vielen abstrakten Methoden. Wenn du weiterhin eine Instanz von TStrings übergibst brauchst du dich nicht wundern wenn an irgend einer Stelle etwas nicht funktioniert.

Assertor 9. Jan 2010 12:19

Re: INDY ftp.list problem
 
Hallo Martin,

Zitat:

Zitat von marteng57
das Problem ist gelöst, auch wenn ich nicht mehr ganz genau sagen kann, auf welchem Wege.
Es war wohl eine Kombination aus benötigtem passive Modus, firewall und ....

Das freut mich, siehste: War doch nicht das Indy FTP.List :)

Zitat:

Zitat von marteng57
idfp.list funktioniert im Übrigen sowohl mit TStrings als auch mit Tstringlist.
Nur wenn das Ergebnis über ListResult abgeholt wird ist TStrings zwingend.

Dafür scheint die überladene Definition von List mit Filter und Details nicht zu greifen, es kommt immer das Gesamtergebnis. Aber das ist nicht schlimm, ich kann es ja nachher filtern.

Das verstehe ich nicht.

IdFTP.List() gibt es in 3 Varianten:
1) procedure TIdFTP.List;
2) procedure TIdFTP.List(const ASpecifier: string; ADetails: Boolean);
3) procedure TIdFTP.List(ADest: TStrings; const ASpecifier: string = ''; ADetails: Boolean = True);

bei 1) und 2) laden die Resultate in IdFTP.ListResult und bei 3) in Deinem eigenen TStrings-Nachfahren. ADetails steuert nur, ob z.B. die Verzeichnis/Gruppenrechte ausgelesen werden.

Wenn hier trotzdem Details kommen, muß da von uns geprüft werden. Das könnte ein Bug sein.

Für das korrekte Parsing der Liste (es gibt ja viele FTP Server die beim Listenresult abweichen) immer wie oben erwähnt die IdAllFTPListParsers einbinden. Dann werden entsprechende Behandlungen für VMS & Co eingebunden.

Zu den TStrings/StringList, aus der englischen D2009 OH:
Zitat:

Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated.
Wir verwenden also - wie eigentlich alle Komponentenentwickler - TStrings, damit der Benutzer die Rückgabe mit TStringList und anderen Nachfahren nutzen kann.

Roter Kasten: SirThornberry war schneller ;)

Gruß Assertor

Morphie 9. Jan 2010 14:12

Re: INDY ftp.list problem
 
Zitat:

Zitat von marteng57
...
idfp.list funktioniert im Übrigen sowohl mit TStrings als auch mit Tstringlist.
Nur wenn das Ergebnis über ListResult abgeholt wird ist TStrings zwingend.
...

also da stimme ich dir nicht zu.
verwende ich nur TStrings, bekomme ich sofort folgenden Fehler:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAbstractError mit der Meldung 'Abstrakter Fehler' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------


verwende ich TStringList, funzt es ohne probleme.

Fazit: man sollte -wie Assertor bereits erwähnte- einen nachfahren verwenden.

bernerbaer 22. Mär 2012 15:45

AW: INDY ftp.list problem
 
Ich habe den gleichen oder mindestens einen ähnlichen Fehler wie im Ursprungsposting beschrieben. List mit indys FTP Client funktioniert nicht.

Delphi 2009
Indy 10.5.8

Problem (Source aufs Wesentliche gekürzt und Fehlerbehandlung entfernt):
Delphi-Quellcode:
IdFTP1.Host:= Edt_server.Text;
IdFTP1.Username:= Edt_User.Text;
IdFTP1.Password:= Edt_Password.Text;
IdFTP1.Connect;
IdFTP1.ChangeDir(Edt_Directory.Text);

IdFTP1.List; // Fehler: Gleitkommadivision durch Null

//Idftp1.list(mylist); //Fehler: Gleitkommadivision durch Null
//Idftp1.list(mylist, '', True); //Fehler: Gleitkommadivision durch Null
//Idftp1.list(mylist, '', False); //Fehler: Gleitkommadivision durch Null
Anmeldung am Server funktioniert
ChangeDir funktioniert
Put und Get funktionieren problemlos

Mit Overbyte ICS funktioniert auf dem gleichen Rechner und gleichen Server der Zugriff per FTP problemlos, nur erlauben mir die Programmspezifikationen die Verwendung von ICS nicht. Unter Delphi 7 funktioniert obiger Code mit indy problemlos.

Ich habe bereits mit allen Properties von IdFTP rumgespielt, Firewalls ausgeschaltet, Indy aktualisiert, aber nichts brachte Erfolg. Hat jemand einen Tip was ich noch versuchen könnte?

[edit] Fehler für Gleitkommadivision gefunden, war ein Fehler von mir, hatte noch was in IdFTP1Work drin, aber die Liste ist immer noch leer![/edit]

[edit2] Problem gelöst! Ein Update des FTP-Servers brachte die Lösung![/edit2]


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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