确定两个文件路径引用同一文件对象的最佳方法是什么?

时间:2015-04-07 17:04:18

标签: c++ c linux windows

我想编写一个单元测试来检查两个文件路径是否相同,但我不想假设字符串表示是相同的。

例如,在Linux上,一个案例中的路径中可能存在符号链接,而另一个案例中则不存在符号链接。在Windows上,一个(X:\foo)上可以有驱动器表示法,另一个(//serverX/foo)上可以有网络表示法。最复杂的是,该文件可能是在NFS共享(/path/to/file语法)上在Linux上编写的,并在Windows上使用DOS语法(X:\to\file)验证,其中X:是NFS挂载到/path

一些想法(在Stack Overflow上找到,但不统一):

  1. 在Linux上,比较stat
  2. 中的inode
  3. 使用realpath(此平台是否独立?)
  4. 在Windows上,比较GetFullPathName
  5. 上的字符串
  6. 在Windows上,比较GetFileInformationByHandle
  7. 的序列号和文件索引

    什么是跨平台的最佳解决方案?我用C ++写这个,但我可以明显地下载到C语言。

2 个答案:

答案 0 :(得分:19)

您可以查看Boost.Filesystem库。具体来说,有一种方法equivalent似乎完全符合您的要求:

using namespace boost::filesystem;

path p("/path/to/file/one");
path q("/sym_link/to/one");
assert(equivalent(p, q));

答案 1 :(得分:1)

文件系统库

从C ++ 17开始,您可以使用标准的<filesystem>库。您要查找的功能是equivalent,位于命名空间std::filesystem下:

bool std::filesystem::equivalent(const std::filesystem::path& p1, const filesystem::path& p2);

documentation进行总结:此函数采用两个路径作为参数,如果它们引用相同的文件或目录,则返回true,否则返回false。还有一个noexcept重载,它带有第三个参数:std::error_code,用于保存任何可能的错误。

有关更多信息,请查看my complete answer,这是另一个堆栈溢出问题。