Perguntas sobre meu primeiro programa usando bibliotecas de impulso (exceções, caminho longo)

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

  •  27-09-2019
  •  | 
  •  

Pergunta

Estou tentando escrever meu primeiro programa no C ++ e preciso usar a BOOST Library. Estou tentando escrever um programa que passa recursivamente por uma árvore de diretório e retorna a data do arquivo mais recente e mais antigo.

É aqui que estou agora:

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

Os problemas que conheci são isso:

1. Quando encontro um caminho muito longo (mais de 256 ou 260 caracteres, eu acho), há um erro:

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

2. Quando eu me encontrar com um diretório não acessível, como "Informações sobre volume do sistema", tenho mais duas:

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

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

Como posso modificar o código acima para lidar com nomes de caminhos longos no Windows? É realmente difícil fazer isso? Alguns programas, como o Total Commander, por exemplo, não têm problemas com caminhos longos, mas muitos programas ainda têm.

A questão mais importante é que como posso realmente fazer com que o código acima funcione (não se preocupe com caminhos longos). O problema é que quando for ( ; it_dir != it_end; ++it_dir ) Encontra -se com um diretório não acessível, ele joga uma exceção e, para pegar essa exceção, preciso definir a captura externa. Mas quando estou fora, isso significa que o por O ciclo não continua. Portanto, isso significa que o código acima funciona até a primeira pasta não acessível. Lá joga uma exceção e termina.

Existe alguma maneira de voltar para o por Ciclo após uma exceção foi jogado?Minha idéia é fazer um ++ it_dir dentro da captura e iniciar o ciclo para o ciclo novamente. Mas como posso começar de novo? Shell eu movo -o para uma função separada?

Desculpe se meu entendimento não está claro, é o meu primeiro projeto. Eu nunca usei C ++ antes, mas estou tentando o meu melhor!

EDITAR:

Alguma outra resposta? O problema é que a captura não está funcionando lado de dentro O ciclo para erros "não acessíveis". Como posso fazê -lo funcionar dentro? Aqui está o menor código que produz o erro. Existe alguma maneira de capturar esse erro dentro do ciclo for? Ou pegue-o de uma maneira que pudesse continuar depois de pular o elemento não acessível com um 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
  }
}
Foi útil?

Solução

Acabou que é um bug no impulso. Encontrei um bilhete de suporte de bugs e contribuí para ele.

Outras dicas

Basta colocar a tentativa/captura dentro do loop para ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top