我想不出有什麼辦法可以改變你得到的響應,但你總是可以嘗試將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);
}
爲什麼不直接將UNC路徑轉換爲映射驅動器路徑? –
驅動器映射相對於*用戶*,UNC路徑相對於*無*。 – casperOne
可能是因爲升級時映射的驅動器不存在。過去我曾經觀察過類似的東西,在所有的映射驅動器都不存在之後。所以說UNC是Windows可以提供給你的唯一東西? – Zarat