如何检查一条path是否是另一条path的孩子?

如何检查一条path是否是另一条path的孩子?
只是检查子string是不是要走的路,因为可以有项目,如。 等等

这将是一种方法,你有路径A和B,使用Path.GetFullPath()函数将它们转换为完整路径。 接下来检查一个完整路径是否是另一个的起始子字符串。

所以那将是

if (Path.GetFullPath(A).StartsWith(Path.GetFullPath(B)) || Path.GetFullPath(B).StartsWith(Path.GetFullPath(A))) { /* ... do your magic ... */ } 

不幸的是,它不像StartsWith那么简单。

这是一个更好的答案,从这个重复的问题改编。 我已经使它成为易用性的扩展方法。 另外,使用暴力catch作为访问文件系统的任何方法都可能会因用户权限而失败。

 public static bool IsSubDirectoryOf(this string candidate, string other) { var isChild = false; try { var candidateInfo = new DirectoryInfo(candidate); var otherInfo = new DirectoryInfo(other); while (candidateInfo.Parent != null) { if (candidateInfo.Parent.FullName == otherInfo.FullName) { isChild = true; break; } else candidateInfo = candidateInfo.Parent; } } catch (Exception error) { var message = String.Format("Unable to check directories {0} and {1}: {2}", candidate, other, error); Trace.WriteLine(message); } return isChild; } 

任何基于字符串的解决方案都可能受到目录遍历攻击或正斜线后缀等问题的影响。 不幸的是,.NET Path类不提供这个功能,但Uri类以Uri.IsBaseOf()的形式提供。

  Uri potentialBase = new Uri(@"c:\dir1\"); Uri regular = new Uri(@"c:\dir1\dir2"); Uri confusing = new Uri(@"c:\temp\..\dir1\dir2"); Uri malicious = new Uri(@"c:\dir1\..\windows\system32\"); Console.WriteLine(potentialBase.IsBaseOf(regular)); // True Console.WriteLine(potentialBase.IsBaseOf(confusing)); // True Console.WriteLine(potentialBase.IsBaseOf(malicious)); // False 

在C#中,你可以这样做:

 string cp = Path.GetFullPath(childPath); string pp = Path.GetFullPath(parentPath); if(pp.StartsWith(cp)) return true; else return false; 

有同样的问题。 如果您将路径设置为字符串,则可以使用StartWith()

 if (pathA.StartsWith (pathB + "\\")) { 

虽然我不确定它是否是跨平台的,但是它能在PC上运行