Namespaces
Variants

std::filesystem:: equivalent

From ja.cppreference.net
ヘッダーで定義 <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以降)

パス p1 と p2 が同一のファイルシステムエンティティに解決されるかどうかをチェックします。

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

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

目次

パラメータ

p1, p2 - 等価性をチェックするパス
ec - 非スローオーバーロードでのエラー報告用出力パラメータ

戻り値

true p1とp2が同じファイルまたはディレクトリを参照し、それらのファイルステータスが同じ場合。 false それ以外の場合。

例外

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

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

注記

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

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

例

#include <cstdint>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main()
{
    // ハードリンクの等価性
    fs::path p1 = ".";
    fs::path p2 = fs::current_path();
    if (fs::equivalent(p1, p2))
        std::cout << p1 << " is equivalent to " << p2 << '\n';
    // シンボリックリンクの等価性
    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"

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR Applied to Behavior as published Correct behavior
LWG 2937 C++17 エラー条件が誤って指定されていた 修正済み

関連項目

2つのパスの字句表現を辞書順で比較する
( std::filesystem::path の公開メンバ関数)
(C++17) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++20)
2つのパスを辞書順で比較する
(関数)
(C++17) (C++17)
ファイル属性を判定する
シンボリックリンクのターゲットをチェックしてファイル属性を判定する
(関数)