こんばんは。
英語ですが、こちらのサイトが見つかりました。
これ以外にほとんど情報が無いことから、おそらくこのWin32APIを利用する方法しか無いのだと思います。
肝になるのはWin32APIのGetFinalPathNameByHandle関数です。
C#
1
2[DllImport("kernel32.dll", SetLastError = true)]
3private static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);
4
5[DllImport("kernel32.dll", SetLastError = true)]
6private static extern int GetFinalPathNameByHandle([In] SafeFileHandle hFile, [Out] StringBuilder lpszFilePath, [In] int cchFilePath, [In] int dwFlags);
7
8private const int CREATION_DISPOSITION_OPEN_EXISTING = 3;
9private const int FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
10
11
12public static string GetRealPath(string path)
13{
14 if (!Directory.Exists(path) && !File.Exists(path))
15 {
16 throw new IOException("Path not found");
17 }
18
19 SafeFileHandle directoryHandle = CreateFile(path, 0, 2, IntPtr.Zero, CREATION_DISPOSITION_OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); //Handle file / folder
20
21 if (directoryHandle.IsInvalid)
22 {
23 throw new Win32Exception(Marshal.GetLastWin32Error());
24 }
25
26 StringBuilder result = new StringBuilder(512);
27 int mResult = GetFinalPathNameByHandle(directoryHandle, result, result.Capacity, 0);
28
29 if (mResult < 0)
30 {
31 throw new Win32Exception(Marshal.GetLastWin32Error());
32 }
33
34 if (result.Length >= 4 && result[0] == '\' && result[1] == '\' && result[2] == '?' && result[3] == '\')
35 {
36 return result.ToString().Substring(4); // "\?\" remove
37 }
38 return result.ToString();
39}
追記
日本語で解説されているサイトが見つかりました。
こちら
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/04 14:09