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

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

  •  27-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать свою первую программу в 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? Это действительно трудно сделать это? Некоторые программы, как итоговый командир, например, не имеют проблем с длинными путями, но многие программы все еще имеют.

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

Есть ли способ вернуться в для цикл после того, как исключение было брошено?Моя идея состоит в том, чтобы сделать ++ IT_DIR внутри улова и снова начать цикл. Но как я могу начать это снова? Shell Я перемещаю это в отдельную функцию?

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

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

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

Решение

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

Другие советы

Просто поставьте попробовать / поймать внутри петли ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top