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

Я пытаюсь написать свою первую программу на 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 ) встречается с недоступным каталогом, он выдает исключение, и чтобы перехватить это исключение, мне нужно определить внешний перехват. Но когда я снаружи, это означает, что цикл for не продолжается. Так что это означает, что приведенный выше код работает до первой недоступной папки. Там он выдает исключение и заканчивается.

Есть ли способ вернуться в цикл for после того, как было выдано исключение? Моя идея состоит в том, чтобы сделать ++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
  }
}

person hyperknot    schedule 24.11.2010    source источник


Ответы (2)


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

person hyperknot    schedule 22.03.2011

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

person Falmarri    schedule 24.11.2010
comment
Один уже есть внутри! Но он не улавливает недоступную ошибку, просто не может найти указанный путь. - person hyperknot; 24.11.2010