Я пытаюсь написать свою первую программу на 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
}
}