C++ 测试文件路径的等价性

C++ 测试文件路径的等价性,c++,winapi,filesystems,C++,Winapi,Filesystems,程序中有两个字符串。每个文件都包含指向某个文件或文件夹的路径。如何检查C++中这些路径是否属于同一个文件/文件夹?我可以使用Windows API执行此操作吗?请查看GetFullPathName:您可以使用字符串库的substr。 首先,您必须正确地将#include for call substr放入。 请看此链接: 祝你好运,也许你会用它 它具有跨平台的附加重量;这显然也是一个潜在优势。请注意下面粗体的API引用,以防您想签出它:GetFileInformationByHandle 效果:

程序中有两个字符串。每个文件都包含指向某个文件或文件夹的路径。如何检查C++中这些路径是否属于同一个文件/文件夹?我可以使用Windows API执行此操作吗?

请查看GetFullPathName:

您可以使用字符串库的substr。 首先,您必须正确地将#include for call substr放入。 请看此链接:

祝你好运,也许你会用它

它具有跨平台的附加重量;这显然也是一个潜在优势。请注意下面粗体的API引用,以防您想签出它:GetFileInformationByHandle

效果:分别根据状态(p1)和状态(p2)确定文件_状态s1和s2

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

如果两个候选实体位于同一位置的同一设备上,则认为两条路径解析为同一文件系统实体。这是由POSIX stat结构的值决定的,该结构由两条路径的stat()获得,具有相等的st_dev值和相等的st_ino值

<> > [Stime>Note :POSIX要求“STE-DEV必须在局域网内是唯一的”。保守POSIX实现可能也希望检查相等的STYSIZE和STMT时间值。Windows实现可以使用<强> GETFILIONEXPRORING <句柄> /强>()作为Stand()的替代物,并考虑“相同”。为dwVolumeSerialNumber、nFileIndexHigh、nFileIndexLow、nFileSizeHigh、nFileSizeLow、ftLastWriteTime.dwLowDateTime和ftLastWriteTime.dwHighDateTime的相等值。--结束注释]

如果(!exists(s1)和&&!exists(s2))| |(is_other(s1)和&is_other(s2)),则抛出文件系统错误,否则在错误报告中指定


您可能正在查找
GetFinalPathNameByHandle(hFile、outPath、outSize、FILE\u NAME\u NORMALIZED、VOLUME\u NAME\u GUID)
使用
IShellFolder::ParseDisplayName()
SHParseDisplayName()
ILCreateFromPath()
,将路径字符串转换为PIDL,然后使用
IShellFolder::CompareIDs()
ILIsEqual()

String-munging!=文件系统逻辑(硬链接、符号链接、UNC路径、映射驱动器号、大小写不敏感…)和cplusplus.com是一个可怕的资源。我们不推荐使用它。@Tomalak:你用什么(书架除外)?哦,我忘了相对路径、嵌入的“…\”和特殊设备。大概more@Tomalak格雷特·卡尔:你能解释一下原因吗?或者这只是你的意见吗?
wcscmp
对你来说不够好?@SS'Kain:想想相关的文件名。例如,“.\..\date\file.dat”的意思可能与“.\file.dat”@SS相同:
wcscmp
没有执行OP所指示的操作,这可能有点阻碍。他没有指定那些可能是相对路径,所以我本能地采取了行动,很抱歉,无论如何,“\u wcsicmp”会比我最初建议的函数做得更好:)或
pathcononicalize
GetFullPathName不会转换指定的文件名,只转换路径。因此,您仍然需要处理文件名,它不仅可能有大小写差异,而且可能是一个短名称(thisismyfile.txt和THISIS~1.txt)
bool equivalent(const path& p1, const path& p2);
bool equivalent(const path& p1, const path& p2, system::error_code& ec);