测试文件路径的等效性

时间:2011-07-12 09:55:00

标签: c++ winapi filesystems

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

5 个答案:

答案 0 :(得分:6)

您可以使用Boost Filesystem

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

equivalent

bool equivalent(const path& p1, const path& p2);
bool equivalent(const path& p1, const path& p2, system::error_code& ec);

效果:分别确定file_status s1和s2,就像状态(p1)和状态(p2)一样。

  

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

     

如果两个候选实体位于同一位置的同一设备上,则认为两条路径解析为同一文件系统实体。这可以通过POSIX stat结构的值来确定,如同两个路径的stat()一样,具有相等的st_dev值和相等的st_ino值。

     

[注意:POSIX要求“st_dev在局域网中必须是唯一的”。保守的POSIX实现也可能希望检查相等的st_size和st_mtime值。 Windows实现可以使用 GetFileInformationByHandle ()作为stat()的代理,并将“相同”视为dwVolumeSerialNumber,nFileIndexHigh,nFileIndexLow,nFileSizeHigh,nFileSizeLow,ftLastWriteTime.dwLowDateTime和ftLastWriteTime.dwHighDateTime的相等值。 - 结束说明]

     

引发:filesystem_error if(!exists(s1)&&!exists(s2))|| (is_other(s1)&& is_other(s2)),否则在错误报告中指定。

答案 1 :(得分:2)

答案 2 :(得分:1)

您可能正在寻找GetFinalPathNameByHandle(hFile, outPath, outSize, FILE_NAME_NORMALIZED | VOLUME_NAME_GUID)

答案 3 :(得分:1)

使用IShellFolder::ParseDisplayName()SHParseDisplayName()ILCreateFromPath()将路径字符串转换为PIDL,然后使用IShellFolder::CompareIDs()ILIsEqual()将PIDL相互比较。< / p>

答案 4 :(得分:-3)

您可以使用String库的 substr 。 首先,您必须正确地将#include用于call substr。 请看这个链接:http://www.cplusplus.com/reference/string/string/substr/

祝你好运