Namespaces
Variants

std::filesystem:: equivalent

From 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 - 非抛出重载中用于错误报告的输出参数

返回值

p1 p2 指向相同文件或目录且其文件状态一致时返回 true ,否则返回 false

异常

任何未标记为 noexcept 的重载在内存分配失败时可能抛出 std::bad_alloc

1) 当底层操作系统API出错时抛出 std::filesystem::filesystem_error ,该异常以 p1 作为第一个路径参数、 p2 作为第二个路径参数,并将操作系统错误代码作为错误码参数进行构造。
2) 若操作系统API调用失败,将 std:: error_code & 参数设置为操作系统API错误码;若无错误发生,则执行 ec. clear ( )

注释

如果两个路径解析到的候选实体位于同一设备的相同位置,则认为这两个路径解析为相同的文件系统实体。对于POSIX系统,这意味着通过POSIX stat() 获取的POSIX stat 结构体 中的 st_dev st_ino 成员必须相等。

特别地,同一文件或目录的所有硬链接都是等效的,而同一文件系统上的符号链接与其目标也是等效的。

示例

#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 << " 等价于 " << 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 << " 等价于 " << 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++标准。

缺陷报告 适用范围 发布时行为 正确行为
LWG 2937 C++17 错误条件规定有误 已修正

参见

按字典序比较两个路径的词法表示
( 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)
按字典序比较两个路径
(函数)
(C++17) (C++17)
确定文件属性
确定文件属性,检查符号链接目标
(函数)