最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

class
<filesystem>

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

    namespace std::filesystem {
      class directory_entry;
    }

## 概要

`directory_entry`は、`directory_iterator`クラスもしくは`recursive_directory_iterator`クラスによってディレクトリ走査をした際に取得できる、ディレクトリ内要素を表すクラスである。

ディレクトリの走査では、オペレーティングシステムのファイルシステムごとに、異なる追加の属性が取得できる。このクラスは、オペレーティングシステムごとの差異を吸収し、ディレクトリ走査を効率的に行えるようさまざまな属性をキャッシュする。

## メンバ関数

### 構築・破棄

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

### 変更

名前 | 説明 | 対応バージョン
--- | --- | ---
`assign` | パスを再代入する | C++17
`replace_filename` | ファイル名を置き換える | C++17
`refresh` | キャッシュを更新する | C++17

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`path` | パスを取得する | C++17
`operator path` | `path`型に変換する | C++17
`exists` | パスが存在するか確認する | C++17
`file_size` | ファイルサイズを取得する | C++17
`hard_link_count` | ハードリンク数を取得する | C++17
`is_regular_file` | 通常ファイルを指しているか確認する | C++17
`is_directory` | ディレクトリを指しているか確認する | C++17
`is_symlink` | シンボリックリンクを指しているか確認する | C++17
`is_block_file` | ブロックデバイスのスペシャルファイルを指しているか確認する | C++17
`is_character_file` | キャラクタデバイスのスペシャルファイル指しているか確認する | C++17
`is_fifo` | FIFOまたはパイプを指しているか確認する | C++17
`is_socket` | ソケットを指しているか確認する | C++17
`is_other` | パスが存在していない、もしくはシステム依存の種別のファイルを指しているかを確認する | C++17
`last_write_time` | 最終更新日時を取得する | C++17
`status` | ファイル状態を取得する | C++17
`symlink_status` | シンボリックリンクの状態を取得する | C++17

### 比較演算子

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

## 例

    #include <iostream>
    #include <filesystem>
    #include <fstream>

    namespace fs = std::filesystem;

    int main()
    {
      fs::create_directory("dir");
      fs::create_directory("dir/inner_dir");
      std::ofstream{"dir/a.txt"};

      // dirディレクトリ内のファイルを列挙する
      for (const fs::directory_entry& x : fs::directory_iterator("dir")) {
        std::cout << x.path() << std::endl;
      }
    }

### 出力例

    "dir/inner_dir"
    "dir/a.txt"

## バージョン

### 言語

- C++17

### 処理系

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

## 参照

- P0317R1 Directory entry caching for filesystem