我想不出任何方法来改变你得到的响应,但你总是可以尝试将 UNC 重新映射回本地 - 为此,你需要调用底层 Win32 调用(C dll 调用) 使用“平台调用”或“PInvoke”;引用 win32 调用的语法有点像:
[DllImport("mpr.dll", CharSet=CharSet.Auto, SetLastError=true)]
[return:MarshalAs(UnmanagedType.Bool)]
public static extern bool WNetGetConnection(
[MarshalAs(UnmanagedType.LPTStr)] string localName,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName,
ref int length);
(这样做是将非托管调用/类型映射到它们的托管等效项,并告诉编译器“嘿,我要调用这些东西之外的代码”)
WNetGetConnection
是一个相当乏味的 Windows 功能:给它一个驱动器号,如果它映射到一个,你会得到一个 UNC 路径。我们将循环通过“已知驱动器号”,依次将每个驱动器号提供给此调用,如果我们得到与返回的 UNC 名称和我们试图“反向映射”的路径的任何部分匹配,我们将替换带有相应驱动器号的路径的 UNC 部分,我们就完成了:
public string GetLocalPathForUnc(string uncName)
{
var mapped = Environment.GetLogicalDrives().Select(drive =>
{
drive = drive.Substring(0,2);
var buffer = new StringBuilder(0xff);
int length = 0xff;
WNetGetConnection(drive, buffer, ref length);
return new {Drive = drive, Unc = buffer.ToString()};
});
var match = mapped
.Where(ob =>
!string.IsNullOrWhiteSpace(ob.Drive) &&
!string.IsNullOrWhiteSpace(ob.Unc))
.FirstOrDefault(ob => uncName.ToLowerInvariant().StartsWith(ob.Unc.ToLowerInvariant()));
return uncName.Replace(match.Unc, match.Drive);
}