2011-03-28 49 views
0

的后裔在C++中,Windows中,我有2条文件路径:Win32函数如果文件是目录

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

如何判断Path2是Path1的后代?有没有Shell功能?我搜索了Shell API并找不到任何。

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

+0

@shellter:'wsh'指Windows脚本宿主,并且与Shell API无关。 – Gabe 2011-03-28 19:17:31

+0

@gabe,我删除了无用的评论。谢谢澄清! – shellter 2011-03-28 19:31:01

回答

1

您可以使用PathCommonPrefix来比较两条路径以获取通用前缀。然后将通用前缀与Path1(您的目录)进行比较。

如果两者相等,那么Path2应该是后代。

或者您也许能够不使用out缓冲区而仅仅通过NULL获取第三个参数,并检查返回值(即通用前缀字符的计数)是否等于Path1的长度。

PathCommonPrefix的文档示例看,它看起来不像PathCommonPrefix在'common'前缀中包含尾随目录分隔符,因此您必须剥离Path1中的尾部sep或调整结果的比较相应地由于缺乏最后的sep。

+0

谢谢,最初,在阅读了MSDN中的函数摘要后,我认为它不起作用,但在阅读示例之后,我发现它应该起作用。 (它已经验证,它的工作原理!) – decasteljau 2011-03-28 20:17:40

+0

@decasteljau你需要规范你的路径才能使它真正起作用。例如,输入C:\ trick和C:\ trick \ ..会导致C:\ trick的通用前缀不正确。你也意识到你不认为这会在交叉点,符号链接等情况下失败。也许这对你确定,但我只是想确保你清楚这个限制。 – 2011-03-28 20:32:06

2

我不相信API中有一个方便的函数来为您解答。但我也不认为编写一个强大的功能来完成这一任务是很困难的。以下是大纲:

  1. 确保Path1和Path2是绝对路径。
  2. 检查Path1和Path2是否引用相同的文件系统对象(下面的更多内容)。
  3. 如果是这样,那么你的函数返回true。
  4. 如果不将最后一个名字从路径2剥离,即删除最后的路径分隔符(\或/)及其后的所有内容。
  5. 如果第4步无法删除任何文本(例如,没有路径分隔符),则您已达到根级别,并且您的函数返回false。
  6. 转到2.

现在,如何检查两个名字指的是同一个文件系统对象。最安全的方法是拨打GetFileInformationByHandle()这两个名称,然后比较dwVolumeSerialNumbernFileIndexLownFileIndexHigh。如果全部相同,则这两个名称指的是同一个对象。

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

+0

这很好,但步骤1有点棘手。 – Gabe 2011-03-28 19:28:47

+0

@Gabe我打电话[PathIsRelative](http://msdn.microsoft.com/en-us/library/bb773660(VS.85).aspx),如果返回true,那么你需要使它绝对(例如与当前目录结合使用,或者与您的应用程序制定的路径相关的内容)。 – 2011-03-28 19:32:55

+1

您还必须删除路径中的任何'..'部分,而不必越过根目录。 – Gabe 2011-03-28 19:39:20

相关问题