- filesystem[meta header]
- std::filesystem[meta namespace]
- function[meta id-type]
- cpp17[meta cpp]
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)
}
- path[link path.md]
2つのエンティティが等価かを確認する。
2つのエンティティが、ファイルシステムとして等価かを確認する。2つが同じパスの場合は等価、それに加えてシンボリックリンクと元のファイルも等価、同じinodeを参照するハードリンクも等価と判断される。
status
(p1)
をs1
、status
(p2)
をs2
として、s1 == s2
かつp1
とp2
がファイルシステムとして等価のエンティティに解決される場合、true
を返し、そうでなければfalse
を返すp1
とp2
両方のエンティティが存在しない、p1
とp2
両方がis_other()
でtrue
を返す種別のエンティティである場合、およびファイルシステムでエラーが発生した場合、 (1) ではstd::filesystem::filesystem_error
例外を送出し、 (2) ではec
にエラー情報が設定されてfalse
が返る
- (1) : ファイルシステムがエラーを報告する場合がある。それに加えて、
p1
とp2
両方のエンティティが存在しない、p1
とp2
両方がis_other()
でtrue
を返す種別のエンティティである場合もエラーである。エラーが発生した場合は、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"));
}
- fs::equivalent[color ff0000]
- fs::create_symlink[link create_symlink.md]
- fs::create_hard_link[link create_hard_link.md]
- fs::create_directory[link create_directory.md]
- fs::create_directory_symlink[link create_directory_symlink.md]
- C++17
- Clang: 7.0 [mark verified]
- GCC: 8.1 [mark verified]
- Visual C++: