TIdFTP Der Versuch alle Daten mit Unterordnern via FTP in ein Ziel zu kopieren



  • Hallo alle miteinander,

    ich habe mal wieder eine Frage.
    Ich nutze ein TIdFTP-Objekt der INDY-Collection aus dem C++ Builer 2009 (wie immer) um damit Daten von einem Industriecumputer auf ein Notebook zu kopieren. Mit "Get" (Methode) erhalte ich die Möglichkeit eine einzellne Datei zu kopieren. Ich möchte aber eine rekursive Funktion vermeiden um darüber alle Dateien mit Unterverzeichnissen zu kopieren. Gibt es eine Methode mit der ich alle Daten einer FTP-Quelle in ein Zielordner kopieren kann, ohne dabei alle Dateien in eine Liste einzutragen?



  • Nun gut,
    ich muss wohl meine Frage vereinfachen. Ich möchte nur die Ordner mit den Unterordnern in eine Liste angezeigt bekommen. Die Methode List scheint dafür ungenügend zu sein, oder? Was muss ich tun'?



  • radian schrieb:

    Was muss ich tun'?

    Die List-Methode rekursiv aufrufen!?
    Was sollte an der Rekursion problematisch sein?



  • Grundsätzlich ist die Rekursion nicht problematisch.
    Ich erhalte nur mit

    IdFTP->List(pListOfData, "", true);
    

    sämtliche Daten mit den Zurgiffsrechten und dem Datum der letzten Änderung. Wenn ich aus dem "true" ein "false" mache erhalte ich logischerweise nur die Namen. Bei mir wird eine Exception ausgelöst, was daruf hinweist, dass es nicht mit dem "ls"-Befehl (FTP-Standard) geht. Somit also keine Auflistung der Ordner sondern nur der Dateien. Problematisch in einem Verzeichnis, welches nur Ordner erhält.
    Ich benötige daher für den rekursiven Durchlauf nur die Ordnernamen und nicht den Rest. Allerdings gibt es keine gültige Liste für. Daher suche ich (wenn vorhanden) einen List-Befehl, der mir nur den Namen der Ordner auswirft ohne den ganzen Zugriffstrechten und Datum. Gibt es da etwas?



  • So, nun bin ich soweit...

    TStringList* 	pListOfFSCData 	= new TStringList();
    	UnicodeString t;
    	int i ;
    
    	IdFTP->TransferType = ftBinary;
    	IdFTP->Host 		= "192.168.31.43";
    	IdFTP->Connect();
    	IdFTP->ChangeDir("CF");
    
    	try {
    		IdFTP->List(pListOfFSCData, "", true);
    	} catch (...) {
    	}
    
    	for (i = 0; i < pListOfFSCData->Count; i++) {
    	  if (ditDirectory==	IdFTP->DirectoryListing->Items[i]->ItemType)
    	  {
    
    	  }
    	}
    
    	IdFTP->Disconnect();
    	delete pListOfFSCData;
    

    Ich versuche nun herauszufinden, ob mein gefundener Eintrag ein "Directory" oder ein "File" ist und wie der Name der Datei/Ordner lautet. Problem ist, dass während der Laufzeit eine Exception ausgeworfen wird. Dieses geschieht bei
    [/cpp] if (ditDirectory== IdFTP->DirectoryListing->Items[i]->ItemType)[cpp]

    mit der Meldung:

    Im Projekt xyz ist eine Exception der Klasse EIdFTPListParseError mit der Meldung 'No IdFTPListParse classes have been registered. Check your use clause! aufgetreten.

    Was mache ich verkehrt und was kann ich nun tun um doch noch auf meinen Namen des Ordners/Datei und die Eigenschaft zu kommen?

    Bitte um Hilfe.



  • Man kann/muss wohl noch ein paar Parser für die verschiedenen Serverantwort-Formate registrieren, als Rundumschlag soll dafür das Einbinden von IdAllFTPListParsers.hpp dienen.
    Stammt von Google, kann ich mangels BCB bzw. Dokumentation nicht verifizieren.



  • Sitze nun seit 7 Stunden daran. Denke, ich mach ne Pause. Danke für den Tip aber der hat nichts gebracht.



  • Habe es gefunden!!!!!!!
    Hura.

    Für alle dir Indy 10.x nutzen:

    #pragma link "IdAllFTPListParsers"
    

    und

    #include <IdAllFTPListParsers.hpp>
    

    Nur zusammen gehts!

    Danke trotzdem an Jansen.


Anmelden zum Antworten