• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <filesystem>

    std::filesystem::status

    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()を呼び出し、エラー情報をクリアする

    戻り値

    備考

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

    例外

    #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

    処理系