名前空間
変種
操作

std::filesystem::equivalent

From cppreference.com
 
 
 
ヘッダー <filesystem> で定義
bool equivalent( const std::filesystem::path& p1,
                 const std::filesystem::path& p2 );
(1) (C++17以降)
bool equivalent( const std::filesystem::path& p1,

                 const std::filesystem::path& p2,

                 std::error_code& ec ) noexcept;
(2) (C++17以降)

パス p1p2 が同じファイルシステムエンティティを指すかどうかをチェックします。

p1 または p2 のいずれかが存在しない場合、エラーが報告されます。

例外を投げないオーバーロードは、エラー時に false を返します。

目次

[編集] Parameters

p1, p2 - 等価性をチェックするパス
エラーコード - 例外を投げないオーバーロードでのエラー報告のための出力パラメータ

[編集] Return value

true の場合、p1p2 が同じファイルまたはディレクトリを参照し、それらのファイルステータスが同じ場合。false の場合はそうでない。

[編集] Exceptions

noexcept とマークされていないオーバーロードは、メモリ割り当てが失敗した場合に std::bad_alloc をスローする可能性があります。

1) 下位 OS API エラーが発生した場合、std::filesystem::filesystem_error をスローします。この例外は、最初のパス引数として p1、2番目のパス引数として p2、エラーコード引数として OS エラーコードを指定して構築されます。
2) OS API呼び出しが失敗した場合、std::error_code& パラメータにOS APIのエラーコードが設定されます。エラーが発生しなかった場合は、ec.clear() が実行されます。

[編集] Notes

2つのパスが同じファイルシステムエンティティを指すと見なされるのは、パスが解決する2つの候補エンティティが同じデバイス上の同じ場所にある場合です。POSIX では、POSIX stat 構造体st_dev および st_ino メンバーが等しいことを意味します。これは、POSIX stat() で取得された場合と同様です。

特に、同じファイルまたはディレクトリのすべてのハードリンクは同等であり、同じファイルシステム上のシンボリックリンクとそのターゲットは同等です。

[編集] Example

#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    // hard link equivalency
    fs::path p1 = ".";
    fs::path p2 = fs::current_path();
    if (fs::equivalent(p1, p2))
        std::cout << p1 << " is equivalent to " << p2 << '\n';
 
    // symlink equivalency
    for (const fs::path lib : {"/lib/libc.so.6", "/lib/x86_64-linux-gnu/libc.so.6"})
    {
        try
        {
            p2 = lib.parent_path() / fs::read_symlink(lib);
        }
        catch (std::filesystem::filesystem_error const& ex)
        {
            std::cout << ex.what() << '\n';
            continue;
        }
 
        if (fs::equivalent(lib, p2))
            std::cout << lib << " is equivalent to " << p2 << '\n';
    }
}

実行結果の例

"." is equivalent to "/var/tmp/test"
filesystem error: read_symlink: No such file or directory [/lib/libc.so.6]
"/lib/x86_64-linux-gnu/libc.so.6" is equivalent to "/lib/x86_64-linux-gnu/libc-2.23.so"

[編集] Defect reports

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2937 C++17 エラー条件の指定が不正確 修正済み

[編集] See also

2つのパスの字列表現を辞書順に比較します
(public member function of std::filesystem::path) [編集]
(C++17)(C++17)(C++20まで)(C++17)(C++20まで)(C++17)(C++20まで)(C++17)(C++20まで)(C++17)(C++20まで)(C++20)
2つのパスを辞書順に比較します
(function) [編集]
(C++17)(C++17)
ファイルの属性を決定する
シンボリックリンクのターゲットを確認してファイルの属性を決定する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)