domande circa il mio primo programma utilizzando le librerie Boost (eccezioni, lungo il percorso)

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

  •  27-09-2019
  •  | 
  •  

Domanda

Sto cercando di scrivere il mio primo programma in C ++, e ho bisogno di usare libreria Boost. Sto cercando di scrivere un programma che va ricorsivamente attraverso un albero di directory e restituisce la data del più recente e il file più vecchio.

Questo è dove sono ora:

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

I problemi che ho incontrato sono che:

1. Quando ho incontrato un troppo lungo percorso (più di 256 o 260 caratteri, credo), c'è un errore:

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

2. Quando mi incontro con una directory non accessibile, come "System Volume Information", ho altri due:

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

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

Come faccio a modificare il codice qui sopra per gestire nomi di percorso lungo sotto Windows? E 'davvero difficile farlo? Alcuni programmi, come Total Commander per esempio, non ha problemi con percorsi lunghi, ma molti programmi hanno ancora.

La domanda più importante è che come posso effettivamente fare il lavoro codice di cui sopra (non preoccuparsi percorsi lunghi). Il problema è che quando for ( ; it_dir != it_end; ++it_dir ) incontra con una directory non è accessibile, viene generata un'eccezione, e per catturare questa eccezione, ho bisogno di definire la cattura di fuori. Ma quando sono fuori di esso significa che il per ciclo non è continua. Quindi significa che il codice precedente funziona per quanto riguarda la cartella prima non accessibile. Ci viene generata un'eccezione e finisce.

Esiste un modo per tornare indietro nel per ciclo dopo un eccezione è stata generata? La mia idea è di fare un ++ it_dir all'interno della cattura e avviare il ciclo di nuovo. Ma come posso farlo ripartire? Shell mi sposto fuori per una funzione separata?

Scusate se la mia comprensione non è chiaro, è il mio primo progetto. Non ho mai usato C ++ prima, ma sto facendo del mio meglio!

EDIT:

Qualsiasi altra risposta? Il problema è che la cattura non funziona all'interno il ciclo per "non accessibile" tipo di errori. Come posso farlo funzionare dentro? Qui è il più piccolo codice di produrre l'errore. Esiste un modo per catturare questo errore all'interno del per il ciclo? O prendere in un modo che potesse continuare dopo aver saltato l'elemento non accessibile 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
  }
}
È stato utile?

Soluzione

Si è scoperto che è un bug in spinta. Ho trovato un ticket di supporto bug per esso e ha contribuito ad esso.

Altri suggerimenti

Basta mettere il try / catch all'interno del ciclo for ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top