从 UNC 路径查找网络驱动器

Finding Network Drive from UNC Path

我创建了一个按钮,用于抓取 Clipboard class 的文本内容,检查它是否是文件夹路径并从中创建一个 hyperlink。用户可能只是从资源管理器中复制路径 window。我遇到的问题似乎与我发现的很多问题相反,是我想要驱动器路径 (T:\Natzely) 而不是 UNC 路径 (\SEOMAFIL02\Trash\Natzely)。

当我 ctrl+v 将复制的路径复制到 Word、记事本或 Outlook 时,它被复制为驱动器路径,但是当我将它复制到 Chrome 的地址栏或尝试从 Clipboard class 它被复制为 UNC 路径。 Microsoft 如何处理这个问题?

我的盘符几乎保持不变,所以我不必担心将来 T 驱动器不是垃圾驱动器。

编辑

这是代码

object clipboardText = Clipboard.GetText();
if(!Directory.Exists(clipboardText.ToString()))
{
    //Show error message
}

doc = GetDoc(); //Get document to add the hyperlink to
sel = doc.Selection;
range = sel.Range;
hyperlinks = sel.Hyperlinks;
hyperlinks.Add(range, ref clipboardText);

编辑编号

Hyperlinks.Add 似乎比剪贴板更成问题。如果我在剪贴板文本 object clipboardText = " " + Clipboard.GetText() 之前添加一个 space 它似乎可以解决问题,hyperlink 现在将有额外的 space 但 link仍然有效。

你看到微软的这个问题了吗? Translate UNC path to local mounted driveletter.

好像有两种方法。第一种方式是从注册表中获取值:

string UNCtoMappedDrive(string uncPath)
{
    Microsoft.Win32.RegistryKey rootKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("network");

    foreach (string subKey in rootKey.GetSubKeyNames())
    {
        Microsoft.Win32.RegistryKey mappedDriveKey = rootKey.OpenSubKey(subKey);

        if (string.Compare((string)mappedDriveKey.GetValue("RemotePath", ""), uncPath, true) == 0)
            return subKey.ToUpperInvariant() + @":\";
    }

    return uncPath;
}

另一种方法是 System.Management。这个例子很大,但这是它的核心:

private void LoadDrives()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT RemoteName, LocalName FROM Win32_NetworkConnection");
    List<UncToDrive> drives = new List<UncToDrive>();
    foreach (ManagementObject obj in searcher.Get())
    {
        object localObj = obj["LocalName"];
        if (!Object.Equals(localObj, null))
            drives.Add(new UncToDrive(obj["RemoteName"].ToString(), localObj.ToString()));
    }
}

他们搜索所有带驱动器 (LocalName) 和不带 (RemoteName) 的路径,然后将它们保存在列表中供以后查找。