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