preguntas acerca de mis primeras bibliotecas Boost programa usando (excepciones, larga trayectoria)

StackOverflow https://stackoverflow.com/questions/4262555

  •  27-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de escribir mi primer programa en C ++, y necesito usar la biblioteca Boost. Estoy tratando de escribir un programa que forma recursiva pasa a través de un árbol de directorios y devuelve la fecha de la más reciente y el archivo más antiguo.

Aquí es donde estoy ahora:

#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;
}

Los problemas que he conocido son las siguientes:

1.Cuando me encuentro con un camino demasiado largo (más de 256 o 260 caracteres, creo), hay un error:

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

se reúnen con un directorio no es accesible, como "System Volume Information" 2.Cuando I, tengo dos más:

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

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

¿Cómo puedo modificar el código anterior para manejar nombres de ruta largos en Windows? ¿Es realmente difícil hacerlo? Algunos programas, como Total Commander, por ejemplo, no tiene problemas con rutas largas, pero muchos programas todavía tienen.

La pregunta más importante es que ¿cómo puedo realmente hacer el trabajo código anterior (no preocuparse acerca de las rutas largas). El problema es que cuando for ( ; it_dir != it_end; ++it_dir ) se reúne con un directorio no es accesible, se produce una excepción, y para atrapar esta excepción, necesito definir el retén exterior. Pero cuando estoy fuera de él significa que el de ciclo es no continuar. Por lo que significa que el código anterior funciona en cuanto a la primera carpeta no es accesible. Allí se produce una excepción y termina.

¿Hay alguna manera de volver a entrar en el de ciclo después de una excepción se ha tirado? Mi idea es hacer un it_dir ++ dentro de la captura e iniciar el ciclo de nuevo. Pero, ¿cómo puedo empezar de nuevo? Shell lo muevo a cabo una función separada?

Lo siento si mi entendimiento no está claro, es mi primer proyecto. Nunca había usado C ++ antes, pero estoy haciendo mi mejor esfuerzo!

EDIT:

Cualquier otra respuesta? El problema es que la captura no está funcionando dentro de el ciclo de "no accesible" tipo de errores. ¿Cómo puedo hacer que funcione dentro? Aquí está el código que produce el error más pequeño. ¿Hay alguna manera de coger este error dentro del ciclo de? O ponerse en una forma que pueda continuar después de saltarse el elemento no accesible con un it_dir ++?

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

  for ( ; it_dir != it_end; ++it_dir ) {
  //something here
  }
}
¿Fue útil?

Solución

Resultó que es un error en alza. He encontrado un ticket de soporte de errores para él y contribuido a ello.

Otros consejos

Sólo hay que poner el try / catch dentro del bucle ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top