2010-11-24 2 views
1

Ich versuche, mein erstes Programm in C++ zu schreiben, und ich muss Boost-Bibliothek verwenden. Ich versuche, ein Programm zu schreiben, das rekursiv durch einen Verzeichnisbaum geht und das Datum der neuesten und ältesten Datei zurückgibt. Dies istFragen über mein erstes Programm mit Boost-Bibliotheken (Ausnahmen, langer Pfad)

, wo ich bin jetzt:

#define BOOST_FILESYSTEM_VERSION 3 

#include "boost/filesystem.hpp" 
#include <iostream> 
#include <ctime> 


using namespace std; 
namespace fs = boost::filesystem; 


int main() { 
fs::recursive_directory_iterator it_end; 
fs::recursive_directory_iterator it_dir("e:\\"); 
fs::path p; 

time_t oldest(time(NULL)); 
time_t newest(0); 

try { 
    for (; it_dir != it_end; ++it_dir) { 
    p = *it_dir; 
    try { 
    time_t t(last_write_time(p)); 
    if (t<oldest) oldest=t; 
    if (t>newest) newest=t; 
    if (fs::is_directory(p)) cout << (p) << " " << t << endl; 
    } 

    catch (const fs::filesystem_error& ex) { 
    cout << "\n" << ex.what() << "\n"; 
    } 
    } 
} 

catch (const fs::filesystem_error& ex) { 
    cout << "\n" << ex.what() << "\n"; 
} 

cout << "\nOldest: " << ctime(&oldest); 
cout << "Newest: " << ctime(&newest) << endl; 

return 0; 
} 

Die Probleme, die ich getroffen habe, dass:

1. Wenn ich einen zu langen Weg begegnen (mehr als 256 oder 260 Zeichen, I denken), gibt es einen Fehler:

boost::filesystem::last_write_time: The system cannot find the path specified: 

2.When ich mit einem nicht zugänglichen Verzeichnis treffen, wie "System Volume Information", ich habe zwei mehr:

boost::filesystem::last_write_time: Access is denied: "e:\System Volume Information" 

boost::filesystem::directory_iterator::construct: Access is denied: "e:\System Volume Information" 

Wie kann ich den obigen Code ändern, um lange Pfadnamen unter Windows zu behandeln? Ist es wirklich schwer es zu tun? Einige Programme, wie Total Commander zum Beispiel, haben keine Probleme mit langen Pfaden, aber viele Programme haben immer noch.

Die wichtigere Frage ist, dass wie kann ich tatsächlich den obigen Code arbeiten (nicht auf lange Wege kümmern). Das Problem ist, dass, wenn for (; it_dir != it_end; ++it_dir) mit einem nicht zugänglichen Verzeichnis trifft, es eine Ausnahme auslöst, und um diese Ausnahme zu fangen, muss ich die äußere catch definieren. Aber wenn ich draußen bin, bedeutet das, dass der für Zyklus nicht fortfährt. Es bedeutet also, dass der obige Code bis zum ersten nicht zugänglichen Ordner funktioniert. Dort löst es eine Ausnahme aus und endet.

Gibt es einen Weg zurück in den für Zyklus, nachdem eine Ausnahme ausgelöst wurde? Meine Idee ist es, ein ++ it_dir innerhalb des Catch zu machen und den Zyklus erneut zu starten. Aber wie kann ich es wieder beginnen? Shell verschiebe ich es zu einer separaten Funktion?

Tut mir leid, wenn mein Verständnis nicht klar ist, es ist mein erstes Projekt. Ich habe vorher nie C++ benutzt, aber ich versuche mein Bestes!

EDIT:

Jede andere Antwort? Das Problem ist, dass der Catch nicht funktioniert innerhalb der Zyklus für "nicht zugänglich" Art von Fehlern. Wie kann ich es innen arbeiten lassen? Hier ist der kleinste Code, der den Fehler erzeugt. Gibt es eine Möglichkeit, diesen Fehler innerhalb des Zyklus zu finden? Oder fangen Sie es so ab, dass es weitergehen kann, nachdem Sie das nicht zugängliche Element mit einem it_dir ++ übersprungen haben?

int main() { 
fs::recursive_directory_iterator it_end; 
fs::recursive_directory_iterator it_dir("e:\\"); 

    for (; it_dir != it_end; ++it_dir) { 
    //something here 
    } 
} 

Antwort

3

Es stellte sich heraus, es ist ein Fehler in Schub. Ich habe ein Bug Support Ticket dafür gefunden und dazu beigetragen.

0

Einfach den try/catch innerhalb der for-Schleife ...

+0

Da ist schon eins drin! Es wird jedoch nicht der "nicht zugreifbar" -Fehler abgefangen, nur der "Pfad kann nicht gefunden werden". – zsero