最終更新日時: 2026年05月29日 12時47分38秒 (JST)
Akira Takahashi が更新

履歴 編集

class
<filesystem>

# std::filesystem::path(C++17)

    namespace std::filesystem {
      class path;
    }

## 概要

`path`は、ファイルシステムのパスを表すクラスである。このクラスは、パスに関して以下のような機能を持つ：

- パスの連結 (`"a"`もしくは`"a/"`ディレクトリと`"b.txt"`ファイル名を連結して`"a/b.txt"`パスとする)
- パスに含まれるディレクトリ、ファイル名、拡張子などの抽出
- 文字コード変換
- パス区切り文字の変換
- その他、文字列レベルのパス変換

このクラス自体は、ファイルシステムを操作しない。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++17
`~path();` | デストラクタ | C++17
`operator=` | 代入演算子 | C++17
`assign` | 代入 | C++17

### パスの加算・追加

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator/=` | パス要素を加算する | C++17
`append` | パス要素を加算する | C++17
`operator+=` | パス文字列を加算する | C++17
`concat` | パス文字列を加算する | C++17

### パスの変更

名前 | 説明 | 対応バージョン
--- | --- | ---
`clear` | パスを空にする | C++17
`make_preferred` | ディレクトリの区切り文字を推奨する形式に変換する | C++17
`remove_filename` | パスからファイル名を除去する | C++17
`replace_filename` | パスに含まれるファイル名を置き換える | C++17
`replace_extension` | パスに含まれる拡張子を置き換える | C++17
`swap` | 他の`path`オブジェクトとデータを入れ替える | C++17

### システムのパスフォーマット

名前 | 説明 | 対応バージョン
--- | --- | ---
`native` | システムの文字コードとしてパス文字列を取得する | C++17
`c_str` | システムの文字コードとしてC言語の文字列表現を取得する | C++17
`operator string_type` | システムの文字コードとして文字列型に変換する | C++17
`string` | システムのマルチバイト文字コードとしてパス文字列を取得する | C++17 非テンプレート版はC++26で非推奨
`display_string` | 表示用のリテラルエンコーディングとしてパス文字列を取得する | C++26
`system_encoded_string` | システム依存エンコーディングとしてパス文字列を取得する | C++26
`wstring` | システムのワイド文字コードとしてパス文字列を取得する | C++17
`u8string` | UTF-8エンコードとしてパス文字列を取得する | C++17
`u16string` | UTF-16エンコードでパス文字列を取得する | C++17
`u32string` | UTF-32エンコードでパス文字列を取得する | C++17

### システム非依存のパスフォーマット

名前 | 説明 | 対応バージョン
--- | --- | ---
`generic_string` | システムのマルチバイト文字コードとして、環境非依存パスフォーマットのパス文字列を取得する | C++17 非テンプレート版はC++26で非推奨
`generic_display_string` | 表示用のリテラルエンコーディングとして、環境非依存パスフォーマットのパス文字列を取得する | C++26
`generic_system_encoded_string` | システム依存エンコーディングとして、環境非依存パスフォーマットのパス文字列を取得する | C++26
`generic_wstring` | システムのワイド文字コードとして、環境非依存パスフォーマットのパス文字列を取得する | C++17
`generic_u8string` | UTF-8エンコードで、環境非依存パスフォーマットのパス文字列を取得する | C++17
`generic_u16string` | UTF-16エンコードで、環境非依存パスフォーマットのパス文字列を取得する | C++17
`generic_u32string` | UTF-32エンコードで、環境非依存パスフォーマットのパス文字列を取得する | C++17

### 比較

名前 | 説明 | 対応バージョン
--- | --- | ---
`compare` | 他のパスと、各パス要素を辞書順で比較する | C++17

### 抽出

名前 | 説明 | 対応バージョン
--- | --- | ---
`root_name` | ルート名を取得する | C++17
`root_directory` | ルートディレクトリを取得する | C++17
`root_path` | ルートパスを取得する | C++17
`relative_path` | ルートパスからの相対パスを取得する | C++17
`parent_path` | 親のパスを取得する | C++17
`filename` | ファイル名を取得する | C++17
`stem` | 拡張子を除いたファイル名を取得する | C++17
`extension` | 拡張子を取得する | C++17

### パス情報の判定

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | パスが空か判定する | C++17
`has_root_name` | ルート名が含まれているか判定する | C++17
`has_root_directory` | ルートディレクトリが含まれているか判定する | C++17
`has_root_path` | ルートパスが含まれているか判定する | C++17
`has_relative_path` | ルートパスからの相対パスが含まれているか判定する | C++17
`has_parent_path` | 親のパスが含まれているか判定する | C++17
`has_filename` | ファイル名が含まれているか判定する | C++17
`has_stem` | 拡張子を除いたファイル名が含まれているか判定する | C++17
`has_extension` | 拡張子が含まれているか判定する | C++17
`is_absolute` | 絶対パスかを判定する | C++17
`is_relative` | 相対パスかを判定する | C++17

### 文字列レベルのパス生成

名前 | 説明 | 対応バージョン
--- | --- | ---
`lexically_normal` | 文字列レベルで正規化する | C++17
`lexically_relative` | 文字列レベルで相対パスに変換する | C++17
`lexically_proximate` | 文字列レベルで相対パスに変換する | C++17

### イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`begin` | ディレクトリ区切りした各パス要素のうち、先頭要素を指すイテレータを取得する | C++17
`end` | ディレクトリ区切りした各パス要素のうち、末尾要素の次を指すイテレータを取得する | C++17

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`value_type` | パスを表現するシステム依存のエンコード文字型。 POSIXベースのシステムでは`char` Windowsベースのシステムでは`wchar_t` | C++17
`string_type` | パス文字列型 `basic_string<value_type>` | C++17
`format` | パスフォーマットの列挙型 | C++17
`iterator` | ディレクトリ区切りの要素を走査するイテレータ | C++17
`const_iterator` | `iterator`の別名 | C++17

## メンバ定数

名前 | 説明 | 対応バージョン
--- | --- | ---
`static constexpr value_type preferred_separator` | 推奨するディレクトリ区切り文字。 POSIXベースのシステムではスラッシュ (`'/'`) Windowsベースのシステムではバックスラッシュ (`L'\\'`) | C++17

## 非メンバ関数

### 一般関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`swap` | 2つの`path`オブジェクトを入れ替える | C++17
`hash_value` | パスのハッシュ値を取得する | C++17

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++17
`operator!=` | 非等値比較 | C++17
`operator<=>` | 三方比較 | C++20
`operator<` | 左辺が右辺より小さいかの判定を行う | C++17
`operator<=` | 左辺が右辺以下かの判定を行う | C++17
`operator>` | 左辺が右辺より大きいかの判定を行う | C++17
`operator>=` | 左辺が右辺以上かの判定を行う | C++17

### パスの連結

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator/` | 2つのパスを連結する | C++17

### 入出力

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator<<` | ストリームへの出力 | C++17
`operator>>` | ストリームからの入力 | C++17

### 生成関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`u8path` | UTF-8エンコードされた文字列からパスオブジェクトを構築する | C++17 C++20で非推奨

## 文字列フォーマットサポート

名前 | 説明 | 対応バージョン
--- | --- | ---
`formatter` | `std::formatter`クラスの特殊化 | C++26

## 例

### POSIXベースシステムの例

    #include <iostream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      fs::path p = "/a/b/c.txt";

      // パスから、ファイル名を除いたディレクトリ、ファイル名、
      // 拡張子を除いたファイル名、拡張子を抽出
      std::cout << "directory : " << p.parent_path() << std::endl;
      std::cout << "filename  : " << p.filename() << std::endl;
      std::cout << "stem      : " << p.stem() << std::endl;
      std::cout << "extension : " << p.extension() << std::endl;

      // パスが絶対パスか相対パスか判定
      if (p.is_absolute()) {
        std::cout << p << "は絶対パス" << std::endl;
      }
      else {
        std::cout << p << "は相対パス" << std::endl;
      }
    }

#### 出力

    directory : "/a/b"
    filename  : "c.txt"
    stem      : "c"
    extension : ".txt"
    "/a/b/c.txt"は絶対パス

### Windowsの例

    #include <iostream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      fs::path p = "C:/a\\b/c.txt";

      // パスから、ファイル名を除いたディレクトリ、ファイル名、
      // 拡張子を除いたファイル名、拡張子を抽出
      std::cout << "directory : " << p.parent_path() << std::endl;
      std::cout << "filename  : " << p.filename() << std::endl;
      std::cout << "stem      : " << p.stem() << std::endl;
      std::cout << "extension : " << p.extension() << std::endl;

      // システム依存のパスフォーマットと、システム非依存のパスフォーマット
      std::wcerr << "native format  : " << p.native() << std::endl;
      std::cout << "generic format : " << p.generic_string() << std::endl;

      // パスが絶対パスか相対パスか判定
      if (p.is_absolute()) {
        std::cout << p << "は絶対パス" << std::endl;
      }
      else {
        std::cout << p << "は相対パス" << std::endl;
      }
    }

#### 出力

    directory : "C:/a\\b"
    filename  : "c.txt"
    stem      : "c"
    extension : ".txt"
    native format  : C:/a\b/c.txt
    generic format : C:/a/b/c.txt
    "C:/a\\b/c.txt"は絶対パス

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0 ✅
- GCC: 8.1 ✅
- ICC: ??
- Visual C++: 2017 Update 7 ✅