Вот еще один возможный метод определения того, является ли путь полностью определенным и допустимым.
Этот метод (*) пытается сгенерировать 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