检查路径是UNC路径还是本地路径的正确方法是什么?

时间:2009-02-06 15:38:13

标签: .net path unc

检查路径是否为UNC路径的最简单方法当然是检查完整路径中的第一个字符是字母还是反斜杠。这是一个很好的解决方案还是会出现问题?

我的具体问题是,如果路径中有驱动器号,我想创建一个System.IO.DriveInfo对象。

6 个答案:

答案 0 :(得分:16)

尝试此扩展方法

public static bool IsUncDrive(this DriveInfo info) {
  Uri uri = null;
  if ( !Uri.TryCreate(info.Name, UriKind.Absolute, out uri) ) {
    return false;
  }
  return uri.IsUnc;
}

答案 1 :(得分:14)

由于在第一和第二位置没有两个反斜杠的路径定义为UNC路径,因此这是一种安全的方法。

第一个位置(c :)中带有驱动器号的路径是带根的本地路径。

没有这些东西的路径(myfolder \ blah)是一个相对的本地路径。这包括只有一个斜杠的路径(\ myfolder \ blah)。

答案 2 :(得分:13)

最准确的方法是使用shlwapi.dll中的一些互操作代码

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[ResourceExposure(ResourceScope.None)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

然后你会这样称呼它:

    /// <summary>
    /// Determines if the string is a valid Universal Naming Convention (UNC)
    /// for a server and share path.
    /// </summary>
    /// <param name="path">The path to be tested.</param>
    /// <returns><see langword="true"/> if the path is a valid UNC path; 
    /// otherwise, <see langword="false"/>.</returns>
    public static bool IsUncPath(string path)
    {
        return PathIsUNC(path);
    }

@JaredPar使用purely managed code获得最佳答案。

答案 3 :(得分:5)

我发现的一个技巧是使用dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)),其中dInfo是DirectoryInfo对象 - 如果该检查返回True则它是UNC路径,否则它是本地路径

答案 4 :(得分:4)

这是我的版本:

public static bool IsUnc(string path)
{
    string root = Path.GetPathRoot(path);

    // Check if root starts with "\\", clearly an UNC
    if (root.StartsWith(@"\\"))
    return true;

    // Check if the drive is a network drive
    DriveInfo drive = new DriveInfo(root);
    if (drive.DriveType == DriveType.Network)
    return true;

    return false;
}

此版本优于@JaredPars版本的优势在于它支持任何路径,而不仅仅是DriveInfo

答案 5 :(得分:0)

也许这个答案对想要验证仅UNC服务器+共享+子目录的人有帮助,例如

等网络存储库的路径
  • \\Server1\Share1
  • \\Server2\Share22\Dir1\Dir2
  • \\Server3

使用以下正则表达式:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$
  • 用最大允许服务器/目录名长度替换32(2次)
  • 用最大允许路径深度(最大目录数)替换10
  • 如果您缺少服务器/目录名称中允许的某些字符,则
  • 延长[A-Za-z0-9_\-](2次)

我已成功测试过它。享受!