std::filesystem::equivalent 通过底层文件系统标识(如 inode 或卷序列号+文件索引)判断两路径是否指向同一实体,要求路径必须存在且可访问,否则抛出 filesystem_error;默认解引用软链接,不支持 no_follow 模式,跨文件系统必返回 false。

std::filesystem::equivalent 会检查文件系统对象是否指向同一实体
它不是字符串比较,也不是路径规范化后相等就返回 true;而是通过底层 inode(Unix/Linux/macOS)或 volume serial + file index(Windows)判断两个路径是否最终解析到同一个文件或目录。只有当两个路径都存在、可访问,且确实对应同一文件系统对象时,才返回 true。
必须确保两个路径都存在且可访问,否则抛出 filesystem_error
常见错误是传入 dangling symlink、不存在的路径,或没有读权限的目录。此时 std::filesystem::equivalent 会抛出 std::filesystem::filesystem_error,而不是返回 false。实际使用前建议先用 exists() 或 status_known() 做预检:
try {
if (std::filesystem::exists(p1) && std::filesystem::exists(p2)) {
bool same = std::filesystem::equivalent(p1, p2);
}
} catch (const std::filesystem::filesystem_error& e) {
// 处理权限拒绝、路径不可达等情况
}
软链接和硬链接行为不同:equivalent 对硬链接返回 true,对软链接需看目标是否相同
std::filesystem::equivalent 默认解引用软链接(即 follow_symlinks = true)。这意味着:
- 两个指向同一文件的硬链接 → 返回
true - 两个软链接,若最终解析到同一文件 → 返回
true - 一个软链接和它所指向的原始文件 → 返回
true - 两个软链接,但目标不同 → 返回
false - 一个软链接指向不存在的目标 → 抛异常(因为解析失败)
不支持禁用软链接跟随 —— 没有类似 equivalent(p1, p2, std::filesystem::symlink_option::no_follow) 的重载。若需比较符号链接自身(而非目标),得手动用 is_symlink() + read_symlink() 提取路径再比字符串。
跨文件系统或挂载点时一定返回 false,即使路径字符串一致
比如 /mnt/disk1/data.txt 和 /mnt/disk2/data.txt 即使内容、名字完全一样,只要不在同一文件系统上,equivalent 就返回 false。这点容易被忽略——尤其在容器、WLS、网络挂载场景下,看似“同一台机器”,实则多个独立文件系统。调试时可用 std::filesystem::status(p).type() 和 std::filesystem::hard_link_count(p) 辅助确认是否真为同一实体。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











