スポンサーリンク
以下のコードを実行して、例外が発生。
std::filesystem::directory_iterator dir_itr = std::filesystem::directory_iterator(path);
directory_iterator::directory_iterator: アクセスが拒否されました。: "C:\Program Files (x86)\Google\CrashReports"
例外はキャッチすればいいが再現できるようにしておきたい。
1.コマンドプロンプトから、以下のコマンドでディレクトリのアクセス制限を設定する。
icacls C:\test\myaccess\accesstest_directory1 /deny Users:(OI)(CI)F
2.以下を実行
#include <iostream> #include <string> #include <filesystem> int main() { std::string pathstr = R"(C:\test\myaccess\accesstest_directory1)"; std::filesystem::path path(pathstr); try { std::filesystem::directory_iterator dir_itr = std::filesystem::directory_iterator(path); } catch (const std::filesystem::filesystem_error& e) { std::cout << e.what() << std::endl; return 1; } }
3.アクセス制限を戻す
icacls C:\test\myaccess\accesstest_directory1 /remove:d Users
これは文字列の変換で発生するのでstd::exceptionでキャッチする。
1.「你好」などCP932で表示できない文字列のフォルダを作成。
2.以下を実行
#include <iostream> #include <string> #include <filesystem> int main() { std::string pathstr = R"(C:\test\myaccess\)"; std::filesystem::path path(pathstr); std::filesystem::directory_iterator dir_itr; // ディレクトリイテレータを取得 try { dir_itr = std::filesystem::directory_iterator(path); } catch (const std::filesystem::filesystem_error& e) { std::cout << e.what() << std::endl; return 1; } //////////////////////////////////////////////////////////
std::string fname; for (const auto& entry : dir_itr) { try { fname = entry.path().filename().string(); std::cout << fname << std::endl; } catch (const std::exception& e) { // Unicode 文字のマッピングがターゲットのマルチバイト コード ページにありません。 std::cout << e.what() << std::endl; } catch (const std::filesystem::filesystem_error& e) { std::cout << e.what() << std::endl; } }
}