質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2627閲覧

c#でシンボリックリンクのリンク先を取得する

Shoto9023

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/04/04 12:01

編集2021/04/04 12:03

c#でシンボリックリンクのリンク先を取得したいです。

シンボリックリンクへのパスを指定してシンボリックリンクのリンク先を返りとして受け取りたいです。

何か方法はありますでしょうか?

検索したところ、SymbolicLink.GetTarget()なるメソッドがあるように書いてあるブログを発見しましたが、System.Windows.Forms名前空間のDataFormats.SymbolicLinkフィールドにはそんなものありませんでした。
参照元らしきリンクは潰れていました。
(以下そのブログのコード)

csharp

1string sLinkTarget = SymbolicLink.GetTarget(path); 2if(sLinkTarget != null){ 3 //ここに入ればターゲットがある = シンボリックリンク 4}else{ 5 //ここに入ればターゲットなしなので、 6 //少なくともシンボリックリンクではない。 7}

使っているのは.Net Framework 4.7.2です。
もしかしたらCoreの方にはあるのか…?なんて考えましたが…

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

検索したところ、SymbolicLink.GetTarget()なるメソッドがあるように書いてあるブログを発見しました

参考にした情報は出典を明示してください。
C#でのファイル操作 - リンク編 - hikarurightのPG戦記

参照元らしきリンクは潰れていました。

SymbolicLinkは独自クラスのようです(コード内容の確認はしていません)
Symbolic Links in C# | The Hive Mind | test driven hosting infrastructure, stuff like that.

投稿2021/04/04 13:05

編集2023/07/26 15:41
TN8001

総合スコア9396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shoto9023

2021/04/04 14:09

出典明示はしようとしましたがコピーしても直に書いてもリンクの作成ができませんでした。 申し訳ありません。
guest

0

ベストアンサー

こんばんは。

英語ですが、こちらのサイトが見つかりました。
これ以外にほとんど情報が無いことから、おそらくこの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 12:45

編集2021/04/04 13:03
Automatic9045

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shoto9023

2021/04/04 14:11

いただいたコードとリンクを参考に書いたところ、ちゃんと動きました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問