Nach bestimmten Ordner mit Boost::Filesystem suchen



  • Mhhhh... xD
    In dem Beispiel sucht der ja nur Dateien. Ok ich weiss... Ordner sind ja vom Prinzip her das gleich wie Dateien. Aber der sucht die ja nur in einem Ordner. Ich möchte aber, dass er ein ganze Partition oder eine ganze Festplatte durchsucht. Oder habe ich einfach nur falsch geschaut?! xD

    Der Ordner...



  • Schau mal hier

    Gruß



  • Die dort angegebene find_file Funktion sucht doch rekursiv.


  • Administrator

    Dort steht dass im angegebenen Ordner und allen Unterordnern gesucht wird. Also z.B. auf Windows "C:/" angeben und dann wird auf der ganzen C-Partition gesucht. Könnte man notfalls auch schnell selber in einem kleinen Testprojekt ausprobieren.

    Und anstatt dass du den File-Namen auf Gleichheit prüfst, machst du es halt mit dem Ordnernamen. Du musst die Funktion minimal umbauen und schon hast du dein gewünschtes Ergebnis.

    Grüssli



  • Sollte man nicht den recursive_iterator nutzen, da

    Boost Filessystem Home schrieb:

    ...
    Note: Recursive directory iteration was added as a convenience function after the above tutorial code was written, so nowadays you don't have to actually code the recursion yourself.
    ...

    Also sowas?

    #include "boost/filesystem.hpp"
    #include <iostream>
    
    for ( boost::filesystem::recursive_directory_iterator end, dir("./"); 
           dir != end; ++dir ) {
           cout << *dir << std::endl;                                    
    }
    

    siehe http://warpedvisions.org/2008/04/25/howto-directory-recursion-in-boost-and-other-tips/

    Gruß


  • Administrator

    Man kann, es schadet aber auch nichts, wenn man es mal selber implementiert, dann lernt man etwas mehr 😉
    Ich persönlich würde allerdings sogar ganz auf die Rekursion verzichten. Ich bin sehr feindlich eingestellt gegenüber der Rekursion. Habe schon viel zu viele negative Erfahrungen damit gemacht.
    Ich würde wahrscheinlich eine std::list oder ein std::stack verwenden, wo ich jeder gefundene Ordner ablege. Und so lange die Ordner durchsuche bis der Container leer ist.

    Grüssli



  • Hallo nochmals!!!
    Vielen Dank für die vielen Antworten!!! Ich habe das jetzt wunderbar hinbekommen mit folgende Code:

    vector<string> sDatei;
    	recursive_directory_iterator end_itr;
    	path dir_path( sPfad, native );
    	for(unsigned int count = 0 ; count<sDateiendungen.size() ; count++) 
    	{
    		for ( recursive_directory_iterator itr( dir_path ); itr != end_itr; itr++) 
    		{ 
    			if (extension(itr->path()) == sDateiendungen[count]) 
    			{
    				sDatei.push_back(sPfad+basename(itr->path())+extension(itr->path()));
    							}
    		}
    	}
    

    Das klappt auch wunderbar. Jedoch nur bei kleineren Ordnern. Wenn ich das auf ganzen Partitionen mache oder bei C\\Programme schießt der mir folgende Exception:

    Unbehandelte Ausnahme bei 0x76ec42eb in Hacksel1.exe: Microsoft C++-Ausnahme: boost::filesystem::basic_filesystem_error<boost::filesystem::basic_path<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,boost::filesystem::path_traits> > an Speicherposition 0x0012e850..
    

    Wisst ihr woran das liegen kann???



  • Hallo,

    Ordner schrieb:

    Wisst ihr woran das liegen kann???

    Z.B. an fehlenden Zugriffsrechten. Du könntest natürlich auch die Ausnahme behandeln... 😉

    MfG,

    Probe-Nutzer



  • Und wie kann ich die Ausnahme behandeln? Sowas habe ich noch nie gemacht. Habt ihr ein kleines Bespiel oder einen Ansatz wie man da dran geht???



  • Ordner... schrieb:

    Und wie kann ich die Ausnahme behandeln? Sowas habe ich noch nie gemacht. Habt ihr ein kleines Bespiel oder einen Ansatz wie man da dran geht???

    In dem Magazin sind derzeit 2 Artikel zur Exceptionbehandlung...
    Modernes Exception-Handling Teil 1 - Die Grundlagen
    Modernes Exception-Handling Teil 2 - Hinter den Kulissen


Anmelden zum Antworten