Как проверить, является ли один путь дочерним по отношению к другому пути?
Просто проверка подстроки - это не путь, потому что там могут быть такие предметы. и т.д.
Как проверить, является ли один путь дочерним по отношению к другому пути?
Ответ 1
Это будет один из способов, у вас есть путь A и B, преобразовать их в полные пути с помощью функции Path.GetFullPath(). Затем проверьте, является ли один из полных путей исходной подстрокой другой.
Итак, это будет
if (Path.GetFullPath(A).StartsWith(Path.GetFullPath(B)) ||
Path.GetFullPath(B).StartsWith(Path.GetFullPath(A)))
{ /* ... do your magic ... */ }
Ответ 2
К сожалению, это не так просто, как 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;
}
Ответ 3
Любое строковое решение потенциально подвержено атакам обхода каталога или проблемам с правильной настройкой, например, с помощью косой черты. К сожалению, класс .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
Ответ 4
В С# вы можете сделать это следующим образом:
string cp = Path.GetFullPath(childPath);
string pp = Path.GetFullPath(parentPath);
if(pp.StartsWith(cp))
return true;
else
return false;
Ответ 5
Была та же проблема. Вы можете использовать StartWith()
, если у вас есть путь как строка
if (pathA.StartsWith (pathB + "\\")) {
Хотя я не уверен, что это кросс-платформенный или нет, но он работает на ПК