• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <filesystem>

    std::filesystem::equivalent

    namespace std::filesystem {
      bool equivalent(const path& p1, const path& p2);                               // (1)
      bool equivalent(const path& p1, const path& p2, std::error_code& ec) noexcept; // (2)
    }
    

    概要

    2つのエンティティが等価かを確認する。

    2つのエンティティが、ファイルシステムとして等価かを確認する。2つが同じパスの場合は等価、それに加えてシンボリックリンクと元のファイルも等価、同じinodeを参照するハードリンクも等価と判断される。

    戻り値

    • status(p1)s1status(p2)s2として、
    • s1 == s2かつp1p2がファイルシステムとして等価のエンティティに解決される場合、trueを返し、そうでなければfalseを返す
    • p1p2両方のエンティティが存在しない、p1p2両方がis_other()trueを返す種別のエンティティである場合、およびファイルシステムでエラーが発生した場合、 (1) ではstd::filesystem::filesystem_error例外を送出し、 (2) ではecにエラー情報が設定されてfalseが返る

    例外

    • (1) : ファイルシステムがエラーを報告する場合がある。それに加えて、p1p2両方のエンティティが存在しない、p1p2両方がis_other()trueを返す種別のエンティティである場合もエラーである。エラーが発生した場合は、std::filesystem::filesystem_error例外を送出する
    • (2) : 投げない

    #include <cassert>
    #include <fstream>
    #include <filesystem>
    
    namespace fs = std::filesystem;
    
    int main()
    {
      std::ofstream{"regular.txt"};
      fs::create_symlink("regular.txt", "regular.symlink");
      fs::create_hard_link("regular.txt", "regular-2.txt");
    
      fs::create_directory("dir");
      fs::create_directory_symlink("dir", "dir_symlink");
    
      // パスを正規化した結果として等価のパスを指している
      assert(fs::equivalent("regular.txt", "./regular.txt"));
    
      // シンボリックリンクとその元は等価
      assert(fs::equivalent("regular.txt", "regular.symlink"));
      assert(fs::equivalent("regular-2.txt", "regular.symlink"));
      assert(fs::equivalent("dir", "dir_symlink"));
    
      // 同じinodeを参照するハードリンクは等価
      assert(fs::equivalent("regular.txt", "regular-2.txt"));
    }
    

    出力

    バージョン

    言語

    • C++17

    処理系