はじめに
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オブジェクトと / 演算子を積極的に活用するのがベストプラクティスです。
