在C ++,Windows中,我有2个文件路径:
如何判断Path2是否是Path1的后代?是否有Shell函数?我搜索过Shell API但找不到任何内容。
注意:我不想自己比较字符串,除非有一种安全的方法使路径可比(处理短名称,相关项目等)。
答案 0 :(得分:2)
我不相信API中有一个方便的功能来为您解答这个问题。但我也不认为写一个强大的功能来做这件事太难了。这是大纲:
现在,如何检查两个名称是否指向同一个文件系统对象。最安全的方法是拨打GetFileInformationByHandle()
两个名称,然后比较dwVolumeSerialNumber
,nFileIndexLow
,nFileIndexHigh
。如果all相等则两个名称引用相同的对象。
请注意,仅比较字符串是不够的,因为单个文件系统对象可以有许多不同的名称。例如,硬链接,符号链接,联结,UNC与映射的驱动器号等等。
答案 1 :(得分:1)
您可以使用PathCommonPrefix比较两个路径以获得公共前缀。然后将公共前缀与Path1(您的目录)进行比较。
如果两者相等,那么Path2应该是后代。
或者您可以在不使用out
缓冲区的情况下离开,只需将NULL
传递给第三个参数,并检查返回值(公共前缀字符的数量)是否等于Path1的长度。
从PathCommonPrefix
的doc示例中,PathCommonPrefix
看起来不像'common'前缀中包含尾随目录分隔符,所以你必须去除Path1中的尾随sep或者相应地调整你的结果比较,因为缺乏尾随的分析。
答案 2 :(得分:0)
这是我提出的一个解决方案,到目前为止它似乎有效(在我有限的测试中)。它测试文件是否是直系后代,并获取相对路径。它基于 PathRelativePathTo
。
BOOL PathDirectRelativePathTo(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo)
{
return PathRelativePathTo(pszPath, pszFrom, dwAttrFrom, pszTo, dwAttrTo) && pszPath[1] == L'\\';
}
前提是当文件是直系后代时,PathRelativePathTo
获取的相对路径以.\
开头。当它不是直系后代时,相对路径以 ..
开头。所以这个函数测试相对路径的第二个字符是否是\
。但同样,我只是想出了这个,所以也许那里潜伏着一些问题。