questions sur mon premier programme en utilisant les bibliothèques Boost (exceptions, long chemin)

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

  •  27-09-2019
  •  | 
  •  

Question

Je suis en train d'écrire mon premier programme en C ++, et je dois utiliser la bibliothèque Boost. Je suis en train d'écrire un programme qui va récursive dans une arborescence de répertoires et retourne la date du plus récent et le plus ancien fichier.

est où je suis maintenant:

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

Les problèmes que j'ai rencontrés sont les suivants:

1. Lorsque je rencontre un chemin trop long (plus de 256 ou 260 caractères, je pense), il y a une erreur:

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

2.Lorsque je rencontre un répertoire non accessible, comme "System Volume Information", j'ai deux autres:

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

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

Comment puis-je modifier le code ci-dessus pour gérer les noms de chemin longs sous Windows? Est-il vraiment difficile de le faire? Certains programmes, comme Total Commander par exemple n'a pas de problème avec de longs chemins, mais de nombreux programmes ont encore.

La question la plus importante est que comment puis-je faire réellement le travail de code ci-dessus (sans se soucier de longs chemins). Le problème est que lorsque for ( ; it_dir != it_end; ++it_dir ) rencontre un répertoire non accessible, il jette une exception, et pour attraper cette exception, je dois définir les prises de l'extérieur. Mais quand je suis à l'extérieur, cela signifie que le cycle pour ne continue pas. Donc, cela signifie que le code ci-dessus fonctionne aussi loin que le premier dossier non accessible. Là, il jette une exception et se termine.

Est-il possible de revenir dans la pour cycle après une exception a été levée? Mon idée est de faire ++ it_dir dans la capture et démarrer le nouveau pour le cycle. Mais comment puis-je commencer à nouveau? déplacer Shell I dehors à une fonction séparée?

Désolé si je comprends pas clair, il est mon premier projet. Je ne ai jamais utilisé C ++ avant, mais je fais de mon mieux!

EDIT:

Toute autre réponse? Le problème est que la prise ne fonctionne pas dans pour le cycle « non accessible » genre d'erreurs. Comment puis-je le faire fonctionner à l'intérieur? Voici le plus petit code produisant l'erreur. Est-il possible d'attraper cette erreur dans le pour le cycle? Ou l'attraper d'une manière qu'il puisse continuer à sauter après l'élément non accessible avec 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
  }
}
Était-ce utile?

La solution

Il est avéré que ce bogue dans boost. J'ai trouvé un ticket de support de bug pour et contribué.

Autres conseils

Il suffit de mettre le try / catch dans la boucle for ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top