ブーストライブラリを使用した最初のプログラムに関する質問(例外、長いパス)
-
27-09-2019 - |
質問
C ++で最初のプログラムを作成しようとしていますが、Boost Libraryを使用する必要があります。私は、ディレクトリツリーを再帰的に通過し、最新および最古のファイルの日付を返すプログラムを作成しようとしています。
これは私が今どこにいるのか:
#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.「システムボリューム情報」のようなアクセス不可能なディレクトリに会うと、さらに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を実行し、再びサイクルを開始することです。しかし、どうすれば再び開始できますか?シェル私はそれを別の関数に移動しますか?
私の理解が明確でない場合は申し訳ありませんが、それは私の最初のプロジェクトです。私は以前に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
}
}
解決
ブーストのバグであることが判明しました。バグサポートチケットを見つけて貢献しました。
他のヒント
forループ内にトライ/キャッチを入れるだけです...