如何确定两个文件名是否引用同一文件

时间:2013-11-19 19:18:11

标签: c++ qt

这是一个关于如何使用Qt的问题。 我有两条路径,让我们说“c:\ users \ herbie \ stuff \ file1.txt”和“c:\ users \ HERBIE \ stuff \ file1.txt”。

我想写一个方法会告诉我这两个路径是否引用同一个文件。这个方法应该在windows和linux下工作。因此我认为Qt类可以用来解决这个问题,但我还没有找到如何做到这一点。

Windows不区分大小写,所以在Windows上这两个引用同一个文件。在linux上,他们会引用不同的文件。

有人知道怎么做吗?字符串比较不起作用(因为区分大小写)和Qt类(如QFileInfo,QDir等)总是按构造函数的方式返回路径,而不是系统上实际存在的名称。

感谢任何帮助!

4 个答案:

答案 0 :(得分:4)

修改

更好地了解boost::filesystem::equivalent:)

如果sf1 == sf2和p1和p2解析为同一文件系统实体,则返回true,否则返回false。

答案 1 :(得分:0)

您需要使用#ifdef编写特定于操作系统的代码。如果您在Windows上运行,请将路径转换为大写,然后进行比较。如果您使用的是Linux,请按原样进行比较。您可以使用每个操作系统上的一些预定义宏。

您可以使用此处的列表:http://sourceforge.net/p/predef/wiki/OperatingSystems/

有了这个,您的代码将类似于:

#ifdef __WINDOWS__
// do case-insensitive compare
#else
// do case-sensitive compare 

答案 2 :(得分:0)

How do I get the correct case of a path?提出了类似的问题。

Slomojo的解决方案有点像黑客攻击,但似乎无法绕过它。

  

没有一种简单的方法可以做到这一点,但你可以尝试做一个   QDir.entryList,然后对结果进行不区分大小写的搜索。   这将为您提供正确的文件名。然后你需要   获得该结果的absolutePath

     

这应该为您提供路径/文件名的保留大小。

答案 3 :(得分:0)

如果两个路径引用同一个文件,

QFileInfo::operator==被定义为返回true,除非(A)一个是Windows 8.3“短”名称而另一个是其“长”名称或(B)当一个是另一个的象征性链接时。这两个例外都不适用。