的后裔在C++中,Windows中,我有2条文件路径:Win32函数如果文件是目录
- 路径1:目录
- 路径2:文件或目录
如何判断Path2是Path1的后代?有没有Shell功能?我搜索了Shell API并找不到任何。
注意:我不想自己比较字符串,除非有一种安全的方法来使路径具有可比性(处理短名称,相关项目等)。
的后裔在C++中,Windows中,我有2条文件路径:Win32函数如果文件是目录
如何判断Path2是Path1的后代?有没有Shell功能?我搜索了Shell API并找不到任何。
注意:我不想自己比较字符串,除非有一种安全的方法来使路径具有可比性(处理短名称,相关项目等)。
您可以使用PathCommonPrefix来比较两条路径以获取通用前缀。然后将通用前缀与Path1(您的目录)进行比较。
如果两者相等,那么Path2应该是后代。
或者您也许能够不使用out
缓冲区而仅仅通过NULL
获取第三个参数,并检查返回值(即通用前缀字符的计数)是否等于Path1的长度。
从PathCommonPrefix
的文档示例看,它看起来不像PathCommonPrefix
在'common'前缀中包含尾随目录分隔符,因此您必须剥离Path1中的尾部sep或调整结果的比较相应地由于缺乏最后的sep。
谢谢,最初,在阅读了MSDN中的函数摘要后,我认为它不起作用,但在阅读示例之后,我发现它应该起作用。 (它已经验证,它的工作原理!) – decasteljau 2011-03-28 20:17:40
@decasteljau你需要规范你的路径才能使它真正起作用。例如,输入C:\ trick和C:\ trick \ ..会导致C:\ trick的通用前缀不正确。你也意识到你不认为这会在交叉点,符号链接等情况下失败。也许这对你确定,但我只是想确保你清楚这个限制。 – 2011-03-28 20:32:06
我不相信API中有一个方便的函数来为您解答。但我也不认为编写一个强大的功能来完成这一任务是很困难的。以下是大纲:
现在,如何检查两个名字指的是同一个文件系统对象。最安全的方法是拨打GetFileInformationByHandle()
这两个名称,然后比较dwVolumeSerialNumber
,nFileIndexLow
,nFileIndexHigh
。如果全部相同,则这两个名称指的是同一个对象。
请注意,比较字符串是不够的,因为单个文件系统对象可能有许多不同的名称。例如硬链接,符号链接,联结,UNC与映射的驱动器号等。
@shellter:'wsh'指Windows脚本宿主,并且与Shell API无关。 – Gabe 2011-03-28 19:17:31
@gabe,我删除了无用的评论。谢谢澄清! – shellter 2011-03-28 19:31:01