Как определить, полностью ли указан путь? - PullRequest
1 голос
/ 23 февраля 2020

Учитывая путь, мне нужно знать, является ли он полностью определенным путем (абсолютный путь).

Я знаю, что есть метод с именем System.IO.Path.IsPathRooted, но он возвращает true для путей, таких как:

  • C: документы
  • / документы

Я видел метод под названием IsPathFullyQualified, который мне интересен, см. здесь , но, к сожалению, кажется, что он не распознается в. NET Framework 4.5. Так есть ли эквивалентный метод для. NET 4.5?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Полный отказ от ответственности: Я сам не писал этот код и не имею на него никаких прав. Это основано на. NET Core Source от Microsoft. Более подробная информация ниже.

TL; DR: Для системы Windows вы можете добавить следующий класс в свой проект и затем вызвать PathEx.IsPathFullyQualified(), чтобы проверить, является ли путь полностью квалифицирован:

Public Class PathEx
    Public Shared Function IsPathFullyQualified(path As String) As Boolean
        If path Is Nothing Then
            Throw New ArgumentNullException(NameOf(path))
        End If

        Return Not IsPartiallyQualified(path)
    End Function

    Friend Shared Function IsPartiallyQualified(path As String) As Boolean
        If path.Length < 2 Then
            ' It isn't fixed, it must be relative.  There is no way to specify a fixed
            ' path with one character (or less).
            Return True
        End If

        If IsDirectorySeparator(path.Chars(0)) Then
            ' There is no valid way to specify a relative path with two initial slashes or
            ' \? as ? isn't valid for drive relative paths and \??\ is equivalent to \\?\
            Return Not (path.Chars(1) = "?"c OrElse IsDirectorySeparator(path.Chars(1)))
        End If

        ' The only way to specify a fixed path that doesn't begin with two slashes
        ' is the drive, colon, slash format- i.e. C:\
        Return Not ((path.Length >= 3) AndAlso
                    (path.Chars(1) = IO.Path.VolumeSeparatorChar) AndAlso
                    IsDirectorySeparator(path.Chars(2)) AndAlso
                    IsValidDriveChar(path.Chars(0)))
        '           ^^^^^^^^^^^^^^^^
        ' To match old behavior we'll check the drive character for validity as
        ' the path is technically not qualified if you don't have a valid drive.
        ' "=:\" is the "=" file's default data stream.
    End Function

    Friend Shared Function IsDirectorySeparator(c As Char) As Boolean
        Return c = Path.DirectorySeparatorChar OrElse c = Path.AltDirectorySeparatorChar
    End Function

    Friend Shared Function IsValidDriveChar(value As Char) As Boolean
        Return (value >= "A"c AndAlso value <= "Z"c) OrElse
               (value >= "a"c AndAlso value <= "z"c)
    End Function
End Class

Откуда взялся этот код (и комментарии)?

Он был извлечен из . NET Core Source Browser общедоступный, адаптированный для работы с. NET Framework и преобразованный в VB. NET.

. NET Метод Core IsPathFullyQualified() использует внутренний метод, называемый IsPartiallyQualified(), чтобы проверить, полностью ли указан путь (частично не указан). Этот внутренний метод имеет разные логики c для разных операционных систем. Это - версия Windows, на которой основан вышеуказанный код.

Использование:

Console.WriteLine(PathEx.IsPathFullyQualified("C:Documents"))    ' False
Console.WriteLine(PathEx.IsPathFullyQualified("/Documents"))     ' False
Console.WriteLine(PathEx.IsPathFullyQualified("C:\Documents"))   ' True
1 голос
/ 24 февраля 2020

Вот еще один возможный метод определения того, является ли путь полностью определенным и допустимым.
Этот метод (*) пытается сгенерировать Uri из предоставленного пути, используя Uri.TryCreate ( ) . Когда этот метод завершается успешно, он затем проверяет непубличное свойство c IsDosPath , которое устанавливается внутренне классом Uri при анализе нового Uri, чтобы определить, является ли он действительным и какой ресурс он представляет.

В исходном коде . Net вы можете видеть , что метод PrivateParseMinimal() выполняет ряд тестов для проверки пути, а также проверяет, является ли DosPath корневым.

Imports System.Reflection

Private Function PathIsFullyQualified(path As String) As (Valid As Boolean, Parsed As String)
    Dim flags = BindingFlags.GetProperty Or BindingFlags.Instance Or BindingFlags.NonPublic
    Dim uri As Uri = Nothing
    If Uri.TryCreate(path, UriKind.Absolute, uri) Then
        Dim isDosPath = CBool(uri.GetType().GetProperty("IsDosPath", flags).GetValue(uri))
        Return (isDosPath, uri.LocalPath)
    End If
    Return (False, String.Empty)
End Function

* Этот метод возвращает Именованный кортеж : поддерживается из Visual Basi c 2017

Я протестировал следующие пути; все они возвращают False, когда я предполагаю, что они должны, кроме "file://c:/Documents":, но метод PathIsFullyQualified также возвращает соответствующий Локальный путь, c:\Documents:

Dim isOk1 = PathIsFullyQualified("C:Documents")            'False
Dim isOk2 = PathIsFullyQualified("/Documents")             'False
Dim isOk3 = PathIsFullyQualified("file://c:/Documents")    'True  => isOk3.Parsed = "c:\Documents"
Dim isOk4 = PathIsFullyQualified("\\Documents")            'False
Dim isOk5 = PathIsFullyQualified("..\Documents")           'False
Dim isOk6 = PathIsFullyQualified(".\Documents")            'False
Dim isOk7 = PathIsFullyQualified("\Documents")             'False
Dim isOk8 = PathIsFullyQualified("//Documents")            'False
Dim isOk9 = PathIsFullyQualified(".Documents")             'False
Dim isOkA = PathIsFullyQualified("..Documents")            'False
Dim isOkB = PathIsFullyQualified("http://C:/Documents")    'False
Dim isOkC = PathIsFullyQualified("Cd:\Documents")          'False
Dim isOkD = PathIsFullyQualified("1:\Documents")           'False
Dim isOkE = PathIsFullyQualified("Z:\\Another Path//docs") 'True => isOkE.Parsed = "Z:\Another Path\docs"
Dim isOkF = PathIsFullyQualified(":\\Another Path//docs")  'False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...