我如何比较2个字符串以确定它们是否使用C/C++在Win32中引用相同的路径?
虽然这会处理很多情况但它会遗漏一些事情:
_tcsicmp(szPath1, szPath2) == 0
例如:
正斜杠/反斜杠
相对/绝对路径.
[编辑]标题已更改为与现有C#问题匹配.
打开与这两个文件CreateFile
,叫GetFileInformationByHandle
两个,和比较dwVolumeSerialNumber
,nFileIndexLow
,nFileIndexHigh
.如果所有三个都相等,则它们都指向同一个文件:
GetFileInformationByHandle
功能
BY_HANDLE_FILE_INFORMATION
结构体
使用来自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);
上面的代码将为所有三个路径表示打印相同的路径..之后您可能希望进行不区分大小写的搜索
看到这个问题:确定两个路径引用C#中同一文件的最佳方法
问题是关于C#,但答案只是Win32 API调用GetFileInformationByHandle
.
从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之前的版本中使用此库,您必须在编译器中启用实验语言功能,并以这种方式包括该库:#include
。然后,您可以在名称空间下使用其功能std::experimental::filesystem
。请注意,实验性文件系统库可能与C ++ 17库不同。请参阅此处的文档。
例如:
#include//... std::experimental::filesystem::equivalent(p1, p2);