Frage

Ich versuche, mein erstes Programm in C ++ zu schreiben, und ich brauche Boost-Bibliothek zu verwenden. Ich versuche, ein Programm zu schreiben, das rekursiv einen Verzeichnisbaum durchlaufen und gibt das Datum der neuesten und die älteste Datei.

Dies ist, 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 begegne einen zu langen Weg (mehr als 256 oder 260 Zeichen, glaube ich), gibt es einen Fehler:

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

2. Wenn ich treffe mit einem nicht zugänglichen Verzeichnis, 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 Code ändern, über 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 noch haben.

Die wichtigere Frage ist, wie kann ich eigentlich die obige Code Arbeit macht (nicht Sorge um lange Wege). Das Problem ist, dass, wenn for ( ; it_dir != it_end; ++it_dir ) mit einem nicht zugänglichen Verzeichnis trifft, ist es eine Ausnahme auslöst, und diese Ausnahme zu fangen, muß ich den außerhalb Fang definieren. Aber wenn ich draußen bin, bedeutet es, dass die für Zyklus weiterhin nicht. So bedeutet es, dass der obige Code bis zum ersten nicht zugänglichen Ordner funktioniert. Es wirft eine Ausnahme und endet.

Gibt es eine Möglichkeit in die gehen zurück für Zyklus nach einer Ausnahme ausgelöst wurde? Meine Idee ist es, ein ++ it_dir innerhalb der Fang zu machen und wieder die für den Zyklus zu starten. Aber wie kann ich es wieder von vorne anfangen? Shell ich es bewegen in eine separate Funktion aus?

Sorry, wenn mein Verständnis nicht klar ist, dann ist es mein erstes Projekt. Ich habe nie C ++ verwendet, bevor aber ich versuche mein Bestes!

EDIT:

Jede andere Antwort? Das Problem ist, dass der Fang nicht funktioniert innen der Zyklus für „nicht zugänglich“ Art von Fehlern. Wie kann ich es im Inneren funktioniert? Hier ist der kleinste Code der Fehler zu erzeugen. Gibt es eine Möglichkeit, diesen Fehler innerhalb des für den Zyklus zu fangen? Oder es in einer Art und Weise fangen, dass es nach dem Überspringen das nicht einsehbaren Elements mit einem it_dir ++?

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

  for ( ; it_dir != it_end; ++it_dir ) {
  //something here
  }
}
War es hilfreich?

Lösung

Es stellte sich heraus, es ist ein Fehler in Schub. Ich habe einen Fehler Support-Ticket für sie gefunden und haben dazu beigetragen.

Andere Tipps

Setzen Sie einfach die try / catch innerhalb der for-Schleife ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top