Win32函数判断文件是否是目录的后代

时间:2011-03-28 18:35:10

标签: windows path filesystems windows-shell

在C ++,Windows中,我有2个文件路径:

  • 路径1 :目录
  • 路径2 :文件或目录

如何判断Path2是否是Path1的后代?是否有Shell函数?我搜索过Shell API但找不到任何内容。

注意:我不想自己比较字符串,除非有一种安全的方法使路径可比(处理短名称,相关项目等)。

3 个答案:

答案 0 :(得分:2)

我不相信API中有一个方便的功能来为您解答这个问题。但我也不认为写一个强大的功能来做这件事太难了。这是大纲:

  1. 确保Path1和Path2是绝对路径。
  2. 检查Path1和Path2是否引用相同的文件系统对象(下面有更多内容)。
  3. 如果是,那么你的函数返回true。
  4. 如果没有从Path2中删除姓氏,即删除最终路径分隔符(\或/)及其后的所有内容。
  5. 如果第4步未能删除任何文本(例如,没有剩下路径分隔符),那么您已达到根级别,并且您的函数返回false。
  6. 转到2.
  7. 现在,如何检查两个名称是否指向同一个文件系统对象。最安全的方法是拨打GetFileInformationByHandle()两个名称,然后比较dwVolumeSerialNumbernFileIndexLownFileIndexHigh。如果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获取的相对路径以.\开头。当它不是直系后代时,相对路径以 .. 开头。所以这个函数测试相对路径的第二个字符是否是\。但同样,我只是想出了这个,所以也许那里潜伏着一些问题。