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

履歴 編集

function
<filesystem>

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

    namespace std::filesystem {
      file_status status(const path& p);                          // (1)
      file_status status(const path& p, error_code& ec) noexcept; // (2)
    }

## 概要

ファイル状態を取得する。

パスがシンボリックリンクを指している場合、シンボリックリンクが指すファイルの状態を取得する。シンボリックリンク自体の状態を取得する場合は、`std::filesystem::symlink_status()`関数を使用すること。

## 効果

- (1) : 以下を行う：

    error_code ec;
    file_status result = status(p, ec);
    if (result.type() == file_type::none)
        throw filesystem_error(実装定義のメッセージ, p, ec);

    return result;

- (2) :
  - 可能なら、ファイルパス`p`が指すファイルの属性を決定する
    - POSIX環境であれば`stat()`関数を使用する
  - OSのファイルシステムAPIによってエラーが報告された場合、`ec`にエラー情報が設定される。そうでなければ、`ec.clear()`を呼び出し、エラー情報をクリアする

## 戻り値

- (1) : ファイルパス`p`が指すファイルの状態を返す
- (2) :
  - `ec`にエラー情報が設定された場合、
    - ファイルパス`p`が見つからなかった場合、`file_status{file_type::not_found, perms::unknown}`が返る
    - ファイルパス`p`は見つかったが属性を決定できなかった場合、`file_status{file_type::unknown, perms::unknown}`が返る
    - そのいずれでもなければ、`file_status{file_type::none, perms::unknown}`が返る
  - 正常にファイル属性を取得できた場合、ファイル種別とファイル権限が設定された`file_status`オブジェクトが返る

## 備考

- ファイルパスの解決でシンボリックリンクが検出された場合、シンボリックリンクのリンク先を使用してファイルパスの解決が継続される

## 例外

- (1) : ファイルが見つからない場合、`std::filesystem::filesystem_error` 例外を送出する
- (2) : 投げない

## 例

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

    namespace fs = std::filesystem;

    int main()
    {
      std::ofstream{"a.txt"};

      // (1)
      {
        try {
          fs::file_status status = fs::status("a.txt");
          assert(status.type() == fs::file_type::regular);
          assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
        }
        catch (fs::filesystem_error& fe) {
          std::cout << fe.what() << std::endl;
        }
      }

      // (2)
      {
        std::error_code ec;
        fs::file_status status = fs::status("a.txt", ec);
        if (ec) {
          std::cout << ec.message() << std::endl;
        }
        else {
          assert(status.type() == fs::file_type::regular);
          assert((status.permissions() & fs::perms::owner_write) != fs::perms::none);
        }
      }
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

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