从UNC路径查找网络驱动器

时间:2015-10-12 17:05:36

标签: c# hyperlink copy clipboard

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

当我将复制的路径转换为Word,记事本或Outlook时,它会被复制为驱动器路径,但是当我将其复制到Chrome的地址栏或尝试从Clipboard类中检索它时,它会被复制作为UNC的道路。微软如何处理这个问题?

我的驱动器信件几乎保持静止,因此我不必担心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);

编辑Numero Dos

Hyperlinks.Add似乎比剪贴板更具问题。如果我在剪贴板文本object clipboardText = " " + Clipboard.GetText()之前添加空格似乎可以解决问题,那么超链接现在将具有额外的空间,但链接仍然可以正常工作。

1 个答案:

答案 0 :(得分:2)

您是否从Microsoft看到此问题? 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)搜索所有路径,然后将它们保存在列表中以便以后查找。