boost::filesystem -> recursive_directory_iterator hat Probleme mit Ordnern, wo der Benutzer keine Rechte besitzt



  • Hallo zusammen,

    wenn unter Windows ein Verzeichnis existiert z.B. "C:\Documents and Settings" und
    mit boost und dem rekursiven Iterator darauf zugegriffen wird, wirft boost eine
    exception (->throw) und somit wird das Durchsuchen abgebrochen.

    Anbei der Bsp. Code:

    #include <boost\filesystem.hpp>
    namespace fs = boost::filesystem;
    
    void FileSystem::scanDrive(const string& drive)
    {
    	try
    	{
    		for(fs::recursive_directory_iterator dir_end, dir(drive); dir != dir_end; ++dir)
    		{
    			fs::path _path(*dir);
    			if(!fs::is_directory(_path))
    			{
    				cout << _path.file_string() << endl;
    			}
    		}
    	}
    	catch(fs::filesystem_error e)
    	{
    		cout << e.what() << endl;
    	}
    }
    

    Gibt es eine Möglichkeit diesen Fehler abzufangen und das Durchsuchen weiter
    laufen zu lassen? D.h. das alle Ordner/Dateien, worauf der Benutzer keine
    Zugriffe hat werden übersprungen?

    Danke im voraus für eure Hilfe.

    Gruß,
    Daniel



  • Vielleicht solltest du die Exception fangen und den Inhalt auswerten ?



  • Erstmal sollte man IMO rausbekommen wo die Exception rausfliegt.
    Wenn sie aus operator ++ rausfliegt, dann halte ich "Fangen und einfach weitermachen" für sehr gewagt. Es sei denn in der Doku wäre speziell erwähnt dass es OK ist, also dass man den Iterator noch weiter verwenden kann, nachdem operator ++ eine Exception geworfen hat.

    Wenn sie aus dem Ctor von fs::path oder aus fs::is_directory rausfliegt, dann sollte es egal sein.

    Möglicher Workaround falls doch operator ++ wirft (was ich fast erwarte): den Rekursiven Abstieg selbst implementieren, und Exceptions beim "Betreten" von Unterverzeichnissen ignorieren.



  • Hi,

    sorry für die späte Antwort (Urlaub) 😉
    Ich habe mich dann entschlossen eine Rekursive Methode zu schreiben. Damit
    funktioniert es einwandfrei.

    Also nur, wen es interessiert:

    void TMAC::FileSystem::rec(const string& path)
    {
    	// -------------------------------------------------------------------------
    	// if path does not exists,abort
    	if(!fs::exists(path) || !fs::is_directory(path))
    	{
    		LOG(Log::warn) << "Path does not exist: " << path;
    		return;
    	}
    
    	// -------------------------------------------------------------------------
    	// ...
    	fs::directory_iterator dir(path), dir_end;
    	for(; dir != dir_end; ++dir)
    	{
    		try
    		{
    			fs::path p(*dir);
    			// if it's directory call rec method again with new path
    			if(fs::is_directory(p))
    			{
    				rec(p.directory_string());
    			}
    			else
    			{
    				// else, validate and save file extension
    				if(!p.extension().compare(".exe"))
    				{
    					// save file properties ...
                                            // ...
    				}
    			}
    		}
    		catch(fs::filesystem_error e)
    		{
    			LOG(Log::error) << e.what();
    		}
    	}
    }
    

    Danke + Gruß,
    Daniel


Anmelden zum Antworten