Win32函数来判断文件是否是目录的后代 在C++、Windows中,我有2个文件路径: 路径1:目录 路径2:文件或目录

Win32函数来判断文件是否是目录的后代 在C++、Windows中,我有2个文件路径: 路径1:目录 路径2:文件或目录,windows,path,filesystems,windows-shell,Windows,Path,Filesystems,Windows Shell,如何判断Path2是否是Path1的后代?有Shell函数吗?我已经搜索了Shell API,但没有找到任何 注意:我不想自己比较字符串,除非有一种安全的方法使路径具有可比性(处理短名称、相对项等)。我不相信API中有一个方便的函数可以为您解答这个问题。但我也不认为写一个健壮的函数来实现这一点太难。以下是大纲: 确保路径1和路径2是绝对路径 检查Path1和Path2是否引用相同的文件系统对象(下面将对此进行详细介绍) 如果是这样,则函数返回true 如果不删除路径2上的姓氏,即删除最终路径分隔

如何判断Path2是否是Path1的后代?有Shell函数吗?我已经搜索了Shell API,但没有找到任何


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

我不相信API中有一个方便的函数可以为您解答这个问题。但我也不认为写一个健壮的函数来实现这一点太难。以下是大纲:

  • 确保路径1和路径2是绝对路径
  • 检查Path1和Path2是否引用相同的文件系统对象(下面将对此进行详细介绍)
  • 如果是这样,则函数返回true
  • 如果不删除路径2上的姓氏,即删除最终路径分隔符(\或/)及其后面的所有内容
  • 如果步骤4未能删除任何文本(例如,没有留下任何路径分隔符),则您已达到根级别,并且函数返回false
  • 去2号
  • 现在,如何检查两个名称是否引用同一个文件系统对象。最安全的方法是调用这两个名称,并比较
    dwVolumeSerialNumber
    nFileIndexLow
    nFileIndexHigh
    。如果全部相等,则两个名称引用同一对象


    请注意,仅比较字符串是不够的,因为单个文件系统对象可以有许多不同的名称。例如硬链接、符号链接、连接、UNC与映射驱动器号等等。

    我不相信API中有一个方便的函数可以为您解答这个问题。但我也不认为写一个健壮的函数来实现这一点太难。以下是大纲:

  • 确保路径1和路径2是绝对路径
  • 检查Path1和Path2是否引用相同的文件系统对象(下面将对此进行详细介绍)
  • 如果是这样,则函数返回true
  • 如果不删除路径2上的姓氏,即删除最终路径分隔符(\或/)及其后面的所有内容
  • 如果步骤4未能删除任何文本(例如,没有留下任何路径分隔符),则您已达到根级别,并且函数返回false
  • 去2号
  • 现在,如何检查两个名称是否引用同一个文件系统对象。最安全的方法是调用这两个名称,并比较
    dwVolumeSerialNumber
    nFileIndexLow
    nFileIndexHigh
    。如果全部相等,则两个名称引用同一对象

    请注意,仅比较字符串是不够的,因为单个文件系统对象可以有许多不同的名称。例如硬链接、符号链接、连接、UNC与映射的驱动器号等。

    您可以使用来比较这两个路径以获得公共前缀。然后将公共前缀与Path1(您的目录)进行比较

    如果两者相等,则Path2应为后代

    或者,您可以不使用
    out
    缓冲区,只传递第三个参数
    NULL
    ,并检查返回值(公共前缀字符的计数)是否等于Path1的长度

    PathCommonPrefix
    的文档示例来看,它不像
    PathCommonPrefix
    在“common”前缀中包含尾部目录分隔符,因此,您必须去掉路径1中的尾随sep,或者由于缺少尾随sep,相应地调整结果的比较。

    您可以使用这两个路径来比较,以获得一个公共前缀。然后将公共前缀与Path1(您的目录)进行比较

    如果两者相等,则Path2应为后代

    或者,您可以不使用
    out
    缓冲区,只传递第三个参数
    NULL
    ,并检查返回值(公共前缀字符的计数)是否等于Path1的长度


    PathCommonPrefix
    的文档示例来看,它不像
    PathCommonPrefix
    在“common”前缀中包含尾部目录分隔符,因此,您必须去掉路径1中的尾部sep,或者相应地调整结果的比较,因为缺少尾部sep。

    这里有一个我提出的解决方案,到目前为止似乎有效(在我有限的测试中)。它测试文件是否是直系子体,并获取相对路径。这是基于


    前提是当文件是直系后代时,
    PathRelativePathTo
    获得的相对路径以
    \
    开头。当它不是直系后代时,相对路径以
    开头。
    。因此,此函数测试相对路径的第二个字符是否为
    \
    。但是,我又一次想到了这个,所以可能在那里的某个地方潜伏着一些问题。

    这里有一个我提出的解决方案,到目前为止似乎有效(在我有限的测试中)。它测试文件是否是直系子体,并获取相对路径。这是基于


    前提是当文件是直系后代时,
    PathRelativePathTo
    获得的相对路径以
    \
    开头。当它不是直系后代时,相对路径以
    开头。
    。因此,此函数测试相对路径的第二个字符是否为
    \
    。但是,我又一次想到了这个,所以可能有一些问题潜伏在那里。

    @Shelleter:
    wsh
    指的是Windows脚本主机,与Shell API无关。@gabe,我已经删除了我无用的评论。谢谢你的澄清@Shelleter:
    wsh
    指的是Windows脚本主机,与Shell API无关。@gabe,我已经删除了无用的注释。谢谢你的澄清@加布,我会打电话的,如果你回来的话
    BOOL PathDirectRelativePathTo(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo)
    {
        return PathRelativePathTo(pszPath, pszFrom, dwAttrFrom, pszTo, dwAttrTo) && pszPath[1] == L'\\';
    }