【C++17】std::filesystem::path の使い方 | パスの構築と連結

目次

はじめに

C++17で導入された<filesystem>ライブラリは、ファイルシステムのパスを統一的に扱うための**std::filesystem::path**というクラスを提供します。このpathオブジェクトは、OSによるパス区切り文字の違い(Windowsの\とLinux/macOSの/)などを吸収し、移植性の高いパス操作を可能にします。

この記事では、pathオブジェクトの基本的な使い方である、構築(生成)と連結について解説します。


【前提】C++17とは?

C++17は、2017年に正式化されたC++言語の規格です。<filesystem> ライブラリはこのC++17で導入されたため、利用するにはC++17に対応したコンパイラと、適切なコンパイラ設定(および、一部の環境ではリンカ設定)が必要になります。


pathオブジェクトの構築と連結のサンプルコード

完成コード

#include <iostream>
#include <filesystem>
#include <string>

// filesystem名前空間のエイリアス
namespace fs = std::filesystem;

int main() {
    // --- 1. 様々な文字列型からの構築 ---
    // C言語スタイルの文字列リテラルから
    fs::path path_from_char_literal = "C:/Users/Public";
    
    // std::stringオブジェクトから
    std::string string_path = "Documents";
    fs::path path_from_string(string_path);

    std::cout << "C言語文字列から: " << path_from_char_literal << std::endl;
    std::cout << "std::stringから: " << path_from_string << std::endl;
    
    std::cout << "\n--- 2. パスの連結 ---" << std::endl;

    // --- a. / 演算子で連結 ---
    // pathオブジェクトと文字列リテラルを連結
    fs::path combined_path1 = path_from_char_literal / "Music";
    std::cout << "/ 演算子: " << combined_path1 << std::endl;

    // --- b. /= 演算子で連結 ---
    fs::path base_path = "D:/Data";
    base_path /= "Images"; // base_path自体が変更される
    base_path /= "2025";
    std::cout << "/= 演算子: " << base_path << std::endl;
    
    return 0;
}

実行結果(環境によりパスの表示形式は異なります)

C言語文字列から: "C:/Users/Public"
std::stringから: "Documents"

--- 2. パスの連結 ---
/ 演算子: "C:/Users/Public/Music"
/= 演算子: "D:/Data/Images/2025"

コードの解説

1. path オブジェクトの構築

std::filesystem::path オブジェクトは、様々な種類の文字列から構築できます。

  • const char* (C言語スタイルの文字列リテラル)
  • std::string
  • ワイド文字版 (const wchar_t*, std::wstring)
  • UTF-8版 (const char8_t*, std::u8string) など

コンストラクタに渡すか、代入演算子 = を使って、これらの文字列からpathオブジェクトを簡単に生成できます。

2. / および /= 演算子によるパスの連結

pathオブジェクトの最も直感的で便利な機能が、/演算子によるパスの連結です。

  • / 演算子: path1 / path2 のように、2つのパス要素を連結した新しいpathオブジェクトを返します。pathオブジェクト、std::string、文字列リテラルの間で自由に組み合わせることができます。
  • /= 演算子: base_path /= "subdir" のように、左辺のpathオブジェクトに、右辺のパス要素を追加します。左辺のオブジェクト自体が変更されます。

これらの演算子は、path1の末尾が区切り文字(/\)で終わっているかどうかを自動で判断し、必要であれば区切り文字を一つだけ挿入してくれます。"C:/Users/""Music" を連結しても、"C:/Users//Music" のようにならず、正しく "C:/Users/Music" となります。


まとめ

今回は、C++17の std::filesystem::path の基本的な使い方である、オブジェクトの構築と連結について解説しました。

  • pathオブジェクトは、様々な文字列から簡単に生成できる。
  • / および /= 演算子を使うことで、OSの区切り文字を意識することなく、直感的で安全なパスの連結が可能。

文字列結合でパスを手動で組み立てる方法は、区切り文字の重複や欠落といったバグを生みやすいため、<filesystem> を使える環境では、pathオブジェクトと / 演算子を積極的に活用するのがベストプラクティスです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次