C#でのファイル操作 - リンク編

Windowsのリンクといえば、「.lnk」というショートカットがあるファイルだけ。


だったはずだったんだ。


しかしそれも過去の話。

Vista以降には「シンボリックリンク」なる機能が実装され、
あたかもそこにそのファイル/フォルダがあるように見える。
とのこと。

そしてさらに「ジャンクション」なる機能も前々からあったらしい。



・・・はぁ。全部対応しないとアカンのね・・・


というわけでまとめ。

シンボリックリンクかどうかチェックする方法
http://troyparsons.com/blog/2012/03/symbolic-links-in-c-sharp/

次に、ジャンクションかどうかをチェックする方法
http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=15633


これらを適宜にパクってやれば大丈夫。
それぞれの意味が分からなければググれば全部出てくるので安心だね。


まず、シンボリックリンクのターゲットを取得

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

ちなみに、シンボリックリンクかどうかの確認であれば、

var attrs = System.IO.File.GetAttributes(dialog.FileName);
                    
if ((attrs & FileAttributes.ReparsePoint)
         == FileAttributes.ReparsePoint)
{
    //ここに入ればシンボリックリンク
}

だけでOKみたい。


次に、ジャンクションかの確認

try{|
    string jLinkTarget = JunctionPoint.GetTarget(path);
}catch{
    //こっちは、リンクじゃないとIOExceptionが投げられる
}


こんな感じで取得できる。
これでリンクかどうかの確認は可能みたいです。


なお、今までどおりの「.lnk」のリンクであれば、
まずは

Windows Script Host Object Model

を参照に追加。(参照の追加->COMの中にあります。)

その後、

IWshShell_Class shell = new IWshShell_Class();
IWshShortcut_Class shortcut;
shortcut = (IWshShortcut_Class)shell.CreateShortcut(path);

string targetPath = shortcut.TargetPath;

で取得できる。

ちなみに、ショートカットかどうかは拡張子みれば判別できるので、
判別自体はとっても簡単っすね。