取得している応答を変更する方法は考えられませんが、いつでも 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
ドライブ文字を指定すると、UNC パスが割り当てられている場合は、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);
}