如何检查路径是否是另一条路径的子路径?

时间:2014-04-01 17:44:53

标签: .net powershell path

说我有以下路径,我们称之为“基地”:

C:\my\dir

以及这两个其他路径,我们将分别称为路径“A”和“B”:

C:\my\dir\is\a\child
C:\not\my\dir

显然,基础必须是一个目录,这是有意义的。路径A在某个任意深度的基础内部,路径B根本不在基础内部。路径A和B可以是文件或目录;这真的没关系。

如何检测到路径A在基本内部而路径B不在?最好是,我们可以避免直接搞乱字符串来做到这一点。

编辑:

我注意到以下路径的情况:

C:\my\dir2\child

目前,在这种情况下,所提出的解决方案都会导致误报,但解决方案应该能够区分。我认为这就是为什么我担心直接通过字符串操作/比较来做这件事。处理这个问题最有效的方法是什么?

此外,我不想对基本路径是否包含尾随目录分隔符做出任何假设。

3 个答案:

答案 0 :(得分:3)

在.NET中,path只是一个字符串。你有静态System.IO.Path类,它可以处理字符串并将路径作为字符串返回。

因此,在这个术语中,我将pathA定义为pathB的子项,如下所示:

bool child = pathA.StartsWith(pathB, StringComparison.OrdinalIgnoreCase);

答案 1 :(得分:1)

这是文本/模式匹配的情况,因此正则表达式工作正常。

PS C:\> $base = "^"+[regex]::escape('C:\my\dir')+".*`$"
PS C:\> $base
^C:\\my\\dir.*$
PS C:\> "C:\my\dir\is\a\child" -match $base
True
PS C:\> "C:\not\my\dir" -match $base
False

正则表达式^C:\\my\\dir.+$查找开始^,后跟字符串文字(使用[regex]::escape()轻松转义),这是基本路径,最后是结束之前的任何内容:.*$

编辑:

要处理注释的情况,只需将反斜杠添加到基础目录,就像这样,

PS C:\> $base = "^"+[regex]::escape('C:\my\dir\')+".*`$"
PS C:\> $base
^C:\\my\\dir\\.*$
PS C:\> "C:\my\dir\is\a\child" -match $base
True
PS C:\> "C:\not\my\dir" -match $base
False
PS C:\> "C:\my\dir2\child" -match $base
False

答案 2 :(得分:1)

这是:  (已编辑以允许指定带或不带尾部反斜杠的基本路径)

$basepath = 'C:\my\dir'

$patha = 'C:\my\dir\is\a\child'
$pathb = 'C:\not\my\dir'
$pathc = 'C:\my\dir2\child'

$patha -like "$($basepath.trim('\'))\*"
$pathb -like "$($basepath.trim('\'))\*"
$pathc -like "$($basepath.trim('\'))\*"
True
False
False