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を参照するハードリンクも等価と判断される。
戻り値
- C++17 :
status(p1)をs1、status(p2)をs2として、s1 == s2かつp1とp2がファイルシステムとして等価のエンティティに解決される場合、trueを返し、そうでなければfalseを返す - C++20 :
p1とp2がファイルシステムとして等価のエンティティに解決される場合、trueを返し、そうでなければfalseを返す - エラーとなる条件は以下である。 (1) では
std::filesystem::filesystem_error例外を送出し、 (2) ではecにエラー情報が設定されてfalseが返る- C++17 :
p1とp2両方のエンティティが存在しない、またはp1とp2両方がis_other()でtrueを返す種別のエンティティである場合。およびファイルシステムでエラーが発生した場合 - C++20 :
p1とp2のいずれか一方でもエンティティが存在しない場合(!exists(p1) || !exists(p2))。およびファイルシステムでエラーが発生した場合
- C++17 :
例外
- (1) : ファイルシステムがエラーを報告する場合がある。それに加えて、上記「戻り値」に挙げた条件もエラーである。エラーが発生した場合は、
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
処理系
- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++:
参照
- LWG Issue 2722.
equivalentincorrectly specifies throws clause- C++17の策定中に、エラー報告の詳細を効果節へ移し、
noexceptなerror_code版と例外送出版の双方で正しく扱えるよう整理された
- C++17の策定中に、エラー報告の詳細を効果節へ移し、
- LWG Issue 2937. Is
equivalent("existing_thing", "not_existing_thing")an error?- C++20で、
p1とp2のいずれか一方でも存在しない場合はエラーとなるよう変更された(C++17では両方が存在しない場合のみエラー)。あわせてis_otherによる条件と、戻り値のs1 == s2の条件が削除された
- C++20で、