std::filesystem::equivalent
| ヘッダ <filesystem> で定義
|
||
bool equivalent( const std::filesystem::path& p1, const std::filesystem::path& p2 ); bool equivalent( const std::filesystem::path& p1, const std::filesystem::path& p2, std::error_code& ec ) noexcept; |
(1) | (C++17以上) |
パス p1 と p2 が同じファイルシステムエンティティに解決されるかどうか調べます。
p1 または p2 が存在しなければ、エラーが報告されます。
例外を投げないオーバーロードは、エラーの場合 false を返します。
引数
| p1, p2 | - | 同等性を確認するパス |
| ec | - | 例外を投げないオーバーロードでエラーを報告するための出力引数 |
戻り値
p1 と p2 が同じファイルまたはディレクトリを参照し、そのファイルステータスが同じであれば true。 そうでなければ false。
例外
std::error_code& 引数を取らないオーバーロードは、ベースとなる OS の API でエラーが発生した場合、第1パス引数に p1、第2パス引数に p2、エラーコード引数に OS のエラーコードを指定して構築された filesystem_error を投げます。 std::error_code& 引数を取るオーバーロードは、 OS の API 呼び出しが失敗した場合、その引数を OS の API のエラーコードに設定し、エラーが発生しない場合は ec.clear() を実行します。 noexcept 指定のないあらゆるオーバーロードは、メモリ確保に失敗した場合 std::bad_alloc を投げる可能性があります。
ノート
2つのパスは、そのパスの解決先の候補エントリが同じデバイスの同じ位置にあれば、同じファイルシステムエンティティに解決されるとみなされます。 POSIX の場合、これは POSIX の stat によって行われたかのように取得された POSIX の stat 構造体のメンバ st_dev および st_ino が等しいという意味です。
特に、同じファイルまたはディレクトリに対するすべてのハードリンクは同等であり、同じファイルシステム上のシンボリックリンクとそのターゲットは同等です。
欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
| DR | 適用先 | 発行時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2937 | C++17 | error condition specified incorrectly | corrected |
例
#include <iostream>
#include <cstdint>
#include <filesystem>
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
fs::path p3 = "/lib/libc.so.6";
fs::path p4 = p3.parent_path() / fs::read_symlink(p3);
if(fs::equivalent(p3, p4))
std::cout << p3 << " is equivalent to " << p4 << '\n';
}
出力例:
"." is equivalent to "/var/tmp/test"
"/lib/libc.so.6" is equivalent to "/lib/libc-2.12.so"
関連項目
(C++17)(C++17) |
ファイルの属性を調べます シンボリックリンクのターゲットを確認しながらファイルの属性を調べます (関数) |