当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《确定Windows中两个路径引用同一文件的最佳方法是什么?》经验,为你挑选了4个好方法。

我如何比较2个字符串以确定它们是否使用C/C++在Win32中引用相同的路径?

虽然这会处理很多情况但它会遗漏一些事情:

_tcsicmp(szPath1, szPath2) == 0

例如:

正斜杠/反斜杠

相对/绝对路径.

[编辑]标题已更改为与现有C#问题匹配.



1> MSN..:

打开与这两个文件CreateFile,叫GetFileInformationByHandle两个,和比较dwVolumeSerialNumber,nFileIndexLow,nFileIndexHigh.如果所有三个都相等,则它们都指向同一个文件:

GetFileInformationByHandle 功能

BY_HANDLE_FILE_INFORMATION 结构体


注意文件应保持打开,否则可能是相同的数字将对应于不同的文件.

2> 小智..:

使用来自kernel32.dll的GetFullPathName,这将为您提供文件的绝对路径.然后使用简单的字符串比较将其与您拥有的其他路径进行比较

编辑:代码

TCHAR buffer1[1000];
TCHAR buffer2[1000];
TCHAR buffer3[1000];
TCHAR buffer4[1000];

GetFullPathName(TEXT("C:\\Temp\\..\\autoexec.bat"),1000,buffer1,NULL);
GetFullPathName(TEXT("C:\\autoexec.bat"),1000,buffer2,NULL);
GetFullPathName(TEXT("\\autoexec.bat"),1000,buffer3,NULL);
GetFullPathName(TEXT("C:/autoexec.bat"),1000,buffer4,NULL);
_tprintf(TEXT("Path1: %s\n"), buffer1);
_tprintf(TEXT("Path2: %s\n"), buffer2);
_tprintf(TEXT("Path3: %s\n"), buffer3);
_tprintf(TEXT("Path4: %s\n"), buffer4);

上面的代码将为所有三个路径表示打印相同的路径..之后您可能希望进行不区分大小写的搜索


硬链接允许单个文件具有两个不同的名称.是的,那些只知道对自己和他人有危险的人,Windows确实支持硬链接.
这不起作用,因为同一文件可以有多个路径

3> sth..:

看到这个问题:确定两个路径引用C#中同一文件的最佳方法

问题是关于C#,但答案只是Win32 API调用GetFileInformationByHandle.



4> Stypox..:

文件系统库

从C ++ 17开始,您可以使用标准文件系统库。使用包括它#include 。您甚至可以在较旧的C ++版本中访问它,请参见脚注。

您要查找的功能是equivalent在名称空间下std::filesystem

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

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

#include 
#include 
//...

int main() {
    std::filesystem::path p1 = ".";
    std::filesystem::path p2 = fs::current_path();
    std::cout << std::filesystem::equivalent(p1, p2));
    //...
}

输出:

1

在C ++ 17之前使用文件系统

要在C ++ 17之前的版本中使用此库,您必须在编译器中启用实验语言功能,并以这种方式包括该库:#include 。然后,您可以在名称空间下使用其功能std::experimental::filesystem。请注意,实验性文件系统库可能与C ++ 17库不同。请参阅此处的文档。
例如:

#include 
//...
std::experimental::filesystem::equivalent(p1, p2);

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有