std::filesystem::equivalent
From cppreference.com
< cpp | filesystem
| ヘッダー <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, |
(2) | (C++17以降) |
パス p1 と p2 が同じファイルシステムエンティティを指すかどうかをチェックします。
p1 または p2 のいずれかが存在しない場合、エラーが報告されます。
例外を投げないオーバーロードは、エラー時に false を返します。
目次 |
[編集] Parameters
| p1, p2 | - | 等価性をチェックするパス |
| エラーコード | - | 例外を投げないオーバーロードでのエラー報告のための出力パラメータ |
[編集] Return value
true の場合、p1 と p2 が同じファイルまたはディレクトリを参照し、それらのファイルステータスが同じ場合。false の場合はそうでない。
[編集] Exceptions
noexcept とマークされていないオーバーロードは、メモリ割り当てが失敗した場合に std::bad_alloc をスローする可能性があります。
1) 下位 OS API エラーが発生した場合、std::filesystem::filesystem_error をスローします。この例外は、最初のパス引数として p1、2番目のパス引数として p2、エラーコード引数として OS エラーコードを指定して構築されます。
[編集] 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) |
ファイルの属性を決定する シンボリックリンクのターゲットを確認してファイルの属性を決定する (関数) |