Win32函数来判断文件是否是目录的后代 在C++、Windows中,我有2个文件路径: 路径1:目录 路径2:文件或目录
如何判断Path2是否是Path1的后代?有Shell函数吗?我已经搜索了Shell API,但没有找到任何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上的姓氏,即删除最终路径分隔
注意:我不想自己比较字符串,除非有一种安全的方法使路径具有可比性(处理短名称、相对项等)。我不相信API中有一个方便的函数可以为您解答这个问题。但我也不认为写一个健壮的函数来实现这一点太难。以下是大纲:
dwVolumeSerialNumber
、nFileIndexLow
、nFileIndexHigh
。如果全部相等,则两个名称引用同一对象
请注意,仅比较字符串是不够的,因为单个文件系统对象可以有许多不同的名称。例如硬链接、符号链接、连接、UNC与映射驱动器号等等。我不相信API中有一个方便的函数可以为您解答这个问题。但我也不认为写一个健壮的函数来实现这一点太难。以下是大纲:
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'\\';
}