フォルダパス末尾の区切り文字対策

フォルダのパスとファイル名を結合してファイルパスを作成したいことがあります。

C#の場合


C#では以下のように結合することでフォルダパスの末尾に区切り文字があってもなくても問題なく結合してくれます。(ただし色々と注意点もある)

    var path = System.IO.Path.Combine(directory, filename);

C++17の場合

これをC++でやろうとすると面倒だなと思っていました。私の業務がC++14までの石器プロジェクトばかりで気づいていなかったのですが、C++17からfilesystemライブラリが標準になっています。

区切り文字なし

#include <filesystem>

namespace fs = std::filesystem;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    std::string filename = "test.txt";
    fs::path directory = R"(C:\tmp)";

    directory.make_preferred();
    std::cout << directory << std::endl;

    auto path = directory / filename; // 区切り文字がない場合は追加、ある場合は追加しない
    std::cout << path << std::endl;

    return 0;
}

実行結果

"C:\\tmp"
"C:\\tmp\\test.txt"

区切り文字あり

#include <filesystem>

namespace fs = std::filesystem;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    std::string filename = "test.txt";
    fs::path directory = R"(C:\tmp\)";

    directory.make_preferred();
    std::cout << directory << std::endl;

    auto path = directory / filename; // 区切り文字がない場合は追加、ある場合は追加しない
    std::cout << path << std::endl;

    return 0;
}

実行結果

"C:\\tmp\\"
"C:\\tmp\\test.txt"

こんな感じでわざわざフォルダパスの末尾をチェックしなくても問題なく結合されたファイルパスが取得できました。

いろいろ仕様が複雑そう(OS・コンパイラによる違い含めて)なので細かいところは参考リンクを参照ください。また、MFCの場合は未確認ですが、CPathT::AddBackslashでできそうです。

参考

operator/ - cpprefjp C++日本語リファレンス
2つのパス要素を連結する。
CPathT クラス
詳細情報: CPathT クラス
タイトルとURLをコピーしました