domande circa il mio primo programma utilizzando le librerie Boost (eccezioni, lungo il percorso)
-
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
}
}
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 ...