从 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) 的路径,然后将它们保存在列表中供以后查找。
我创建了一个按钮,用于抓取 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) 的路径,然后将它们保存在列表中供以后查找。