スポンサーリンク

std::filesystemを使って出たときの例外テストをした

アクセスが拒否されました

以下のコードを実行して、例外が発生。

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

Unicode 文字のマッピングがターゲットのマルチバイト コード ページにありません。

これは文字列の変換で発生するので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;
        }
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: