Подтвердить что ты не робот

Как проверить, является ли один путь дочерним по отношению к другому пути?

Как проверить, является ли один путь дочерним по отношению к другому пути?
Просто проверка подстроки - это не путь, потому что там могут быть такие предметы. и т.д.

4b9b3361

Ответ 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 + "\\")) {

Хотя я не уверен, что это кросс-платформенный или нет, но он работает на ПК