给定一个路径,我需要知道它是否是完全限定路径(绝对路径(。
我知道有一个叫做System.IO.Path.IsPathRooted
的方法,但对于这样的路径,它会返回true
- C:文档
- /文件
我看到了一个名为IsPathFullyQualified
的方法,我对此感兴趣,请参阅此处,但不幸的是,它似乎没有在下面被识别。NET框架4.5。有什么等效的方法吗。净4.5?
完整免责声明:我不是自己写这段代码的,也不拥有任何权限。这是基于。NET核心源代码。下面是更多信息。
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
Private 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
Private Shared Function IsDirectorySeparator(c As Char) As Boolean
Return c = Path.DirectorySeparatorChar OrElse c = Path.AltDirectorySeparatorChar
End Function
Private 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核心源代码浏览器,它是公开可用的,适合与合作。NET Framework,并转换为VB.NET.
。NET Core的IsPathFullyQualified()
方法使用一个名为IsPartiallyQualified()
的内部方法来检查路径是否完全限定(而不是部分限定(。对于不同的操作系统,该内部方法具有不同的逻辑。这是上述代码所基于的Windows版本。
用法:
Console.WriteLine(PathEx.IsPathFullyQualified("C:Documents")) ' False
Console.WriteLine(PathEx.IsPathFullyQualified("/Documents")) ' False
Console.WriteLine(PathEx.IsPathFullyQualified("C:Documents")) ' True
这里有另一种可能的方法来确定Path是否是完全限定的并且也是有效的
此方法(*(尝试使用Uri从提供的路径生成Uri。TryCreate((。当此方法成功时,它将检查非公共的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 Basic 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 Pathdocs"
Dim isOkF = PathIsFullyQualified(":\Another Path//docs") 'False
我在使用这种方法时遇到了这个问题,但意识到其他答案过于复杂。
我在这里查看了MS的源代码:https://source.dot.net/#System.Private.CoreLib/Path.cs,3b4bff90471c3a68
在这里:https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,807960f08fca497d
我注意到,在第二个链接中,检查IsPathRooted的方法之一是检查以下内容:(length >= 2 && path[1] == VolumeSeparatorChar)
。我只是把那张支票修改成了一种充实的方法。
。Net源代码(链接1(本质上是IsPathFullyQualified => !IsPathRooted
,我认为它还不足以进行健全性检查。这是我的替代者。
public static bool IsPathFullyQualified(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
return path.Length >= 3 && path[1] == System.IO.Path.VolumeSeparatorChar && ( path[2] == System.IO.Path.DirectorySeparatorChar | path[2] == System.IO.Path.AltDirectorySeparatorChar );
}
编辑:我意识到上面这个简短的方法不接受UNC路径。因此,更新后的版本(诚然,它只是通过删除IsPartiallyQualified方法对原始答案的缩短版本(如下:
public static bool IsPathFullyQualified(string path)
{
if (path == null) throw new ArgumentNullException(nameof(path));
if (path.Length < 2) return false; //There is no way to specify a fixed path with one character (or less).
if (path.Length == 2 && IsValidDriveChar(path[0]) && path[1] == System.IO.Path.VolumeSeparatorChar) return true; //Drive Root C:
if (path.Length >= 3 && IsValidDriveChar(path[0]) && path[1] == System.IO.Path.VolumeSeparatorChar && IsDirectorySeperator(path[2])) return true; //Check for standard paths. C:
if (path.Length >= 3 && IsDirectorySeperator(path[0]) && IsDirectorySeperator(path[1])) return true; //This is start of a UNC path
return false; //Default
}
private static bool IsDirectorySeperator(char c) => c == System.IO.Path.DirectorySeparatorChar | c == System.IO.Path.AltDirectorySeparatorChar;
private static bool IsValidDriveChar(char c) => c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';