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