Exception beim Durchgehen aller Verzeichnisse mit Boost::Filesystem



  • Hi! 🙂

    Mit folgendem Code möchte ich durch alle Verzeichnisse und Unterverzeichnisse eines Laufwerks "laufen". Benutze dazu wie im Titel gesagt die Filesystem Bibliothek von Boost.
    Funktioniert soweit auch, bis auf dieses Problem: Kommt es an den (versteckten und schreibgeschützten) Ordner "System Volume Information", wird eine Exception geworfen, die auf ein what() mit diesem hier antwortet: "boost::filesystem::basic_directory_iterator constructor".
    System ist Windows XP, die Boost-Sourcen hab ich mir erst letzte Woche heruntergeladen und compiliert, sollten also aktuell sein.

    Code ist dieser hier:

    for (std::set<std::string>::iterator itrDrives=oDrives.begin(); itrDrives!=oDrives.end(); itrDrives++)
      {
        bfs::path oRootPath=bfs::system_complete(bfs::path(*itrDrives, bfs::native));
        oDirectories.insert(oRootPath.native_directory_string());
        for (std::set<std::string>::iterator itrScan=oDirectories.begin(); itrScan!=oDirectories.end(); itrScan++)
        {
          bfs::path oCurPath=bfs::system_complete(bfs::path(*itrScan, bfs::native));
          bfs::directory_iterator itrEOD;
          for (bfs::directory_iterator itrScanDir(oCurPath); itrScanDir!=itrEOD; itrScanDir++)
          {
            if (bfs::is_directory(itrScanDir->status()))
              oDirectories.insert((itrScanDir->path()).native_directory_string());
          }
        }
      }
    

    Verzeiht, wenn das alles noch wirr wirkt; ist neu für mich, wär für Tipps die nix direkt mit dem Problem zutun also auch dankbar. 😉

    Viele Grüße,
    Mao



  • Und wo ist deine Frage? 🙄



  • Sorry, Frage ist folgende:
    Warum kommt die Exception? Was kann ich dagegen tun bzw. was mach ich falsch?



  • Du kannst nichts dagegen tun. Eine Exception ist ein Ausnahmefehler. Es dient dazu, dich über einen Ausnahmefall zu informieren. Und du kannst darauf reagieren. Wie und ob du darauf reagierst, ist dir persönlich freigestellt.

    - Du kannst sie z.B. einfach abfangen und gut ist (also nicht mal eine Info an den User geben).

    - Du kannst sie abfangen und eine neue bzw. andere Exception weiter werfen.

    - Du kannst sie abfangen und ganz spetakuläre Aktionen ausführen (einen anderen Programmverlauf veranlassen, oder Reports an einen Server schicken...)

    - Du kannst sie auch garnicht abfangen, und irgend jemand anderes muß sie abfangen.

    Es muß auch nicht heißen, das du was falsch gemacht hast. Kommt auf die Exception und die what-Meldung an.

    Hier ist ein Tutorial.



  • Ja, was Exceptions sind war mir so schon klar. 😉
    Ich meinte nur, dass ich evtl. etwas bei der Verwendung der Bibliothek missachtet hätte. Denn wie du ja selbst sagst ist eine Exception eine Ausnahme, die auf irgendeinen Missstand hinweisen soll. Boost::Filesystem ist mir (wie all die anderen Boost-Libs auch) neu.

    Dann werd ich die Exception im Programmablauf halt ignorieren. 🙂

    Viele Grüße,
    Mao



  • Du hast dir doch für den Grund der Exception schon selber die Antwort gegeben:

    Kommt es an den (versteckten und schreibgeschützten) Ordner "System Volume Information", wird eine Exception geworfen



  • War für mich mehr ein Auslöser, als ein Grund. Ich sagte ja bereits: Wäre ja ebenso möglich gewesen, dass ich einen Fehler im Umgang mit der Bibliothek gemacht habe.



  • Der Fehler liegt einfach darin, daß man nicht direkt das Verzeichnis 'System Volume Information' öffnen kann. (Kannst es ja vom Explorer aus mal versuchen!)

    Also fang die Exception einfach lokal ab und nimm das nächste Verzeichnis (bzw. die nächste Datei).



  • Ah, dann bin ich jetzt wenigstens beruhigt, dass ich nix gänzlich falsch gemacht habe. 😉

    Danke!
    Mao


Anmelden zum Antworten