说我有以下路径,我们称之为“基地”:
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
目前,在这种情况下,所提出的解决方案都会导致误报,但解决方案应该能够区分。我认为这就是为什么我担心直接通过字符串操作/比较来做这件事。处理这个问题最有效的方法是什么?
此外,我不想对基本路径是否包含尾随目录分隔符做出任何假设。
答案 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