вопросы о моей первой программе, использующей библиотеки Boost (исключения, длинный путь) - PullRequest
1 голос
/ 24 ноября 2010

Я пытаюсь написать свою первую программу на C ++, и мне нужно использовать библиотеку Boost.Я пытаюсь написать программу, которая рекурсивно проходит через дерево каталогов и возвращает дату самого нового и самого старого файла.

Вот где я сейчас:

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

проблемы, с которыми я столкнулся:

1. Когда я сталкиваюсь с слишком длинным путем (думаю, более 256 или 260 символов), возникает ошибка:

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

2. Когда я встречаюсь с недоступным каталогом, таким как «Сведения о томе системы», у меня есть еще два:

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

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

Как я могу изменить приведенный выше код для обработки длинных имен путей под Windows? Это действительно трудно сделать?У некоторых программ, таких как, например, Total Commander, нет проблем с длинными путями, но многие программы все еще имеют проблемы.

Более важный вопрос заключается в том, как я могу на самом деле заставить работать вышеуказанный код (не заботясь о длинных путях).Проблема в том, что когда for ( ; it_dir != it_end; ++it_dir ) встречается с недоступным каталогом, он выдает исключение, и для его обнаружения мне нужно определить внешний улов.Но когда я на улице, это означает, что цикл для не продолжается.Таким образом, это означает, что приведенный выше код работает как первая недоступная папка.Там он выдает исключение и завершается.

Есть ли способ вернуться к циклу для после того, как было сгенерировано исключение? Моя идея сделать++ it_dir внутри catch и снова запустить цикл for.Но как я могу начать это снова?Оболочка Я перенес это в отдельную функцию?

Извините, если мое понимание не ясно, это мой первый проект.Я никогда раньше не использовал C ++, но я стараюсь изо всех сил!

РЕДАКТИРОВАТЬ:

Любой другой ответ?Проблема в том, что улов не работает внутри цикла для "недоступных" ошибок.Как я могу заставить это работать внутри?Вот самый маленький код, выдающий ошибку.Есть ли способ отловить эту ошибку внутри цикла for?Или поймать его так, чтобы оно могло продолжаться после пропуска недоступного элемента с помощью 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
  }
}

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Оказалось, это ошибка в boost.Я нашел заявку на поддержку ошибок и внес в нее свой вклад.

0 голосов
/ 24 ноября 2010

Просто поместите try / catch внутри цикла for ...

...