Windows
windows7

シンボリックリンクの使い方と落とし穴

More than 3 years have passed since last update.

仕事でシンボリックリンクを使っているので、その覚書です。

この記事はあくまで「使い方」についての話です。
詳しい仕組みなどは他の解説されているサイトをご覧ください。

シンボリックリンクとは?

簡単に言うとショートカットのようなもので、とあるフォルダやファイルのリンクを保持しているものです。

ショートカットとの大きな違いは、シンボリックリンクを辿った際のパスです。

例として、以下のフォルダ構成を挙げます。
image

アイコンは一緒ですが、symlink がシンボリックリンク、shortcut がショートカットです。
両方共 C:\linksrc フォルダへのリンクを持っています。

この時、ショートカットを使うと...
image

アドレスバーは C:\linksrc と表示されています。

次に、シンボリックリンクを使うと...
image

なんと、アドレスバーは D:\Workspace\link\symlink を指しています。

これがショートカットとシンボリックリンクの大きな違いです。
シンボリックリンクの場合は、シンボリックリンクから辿ったパスを使ってリンク先に対してアクセスすることができます。
もちろん、コマンドラインからも同様にアクセスすることができます。

詳しい説明はこちらを記事をご覧ください。

シンボリックリンクの使い道

このシンボリックリンクですが、バッチファイルを使う場合に重宝します。
例として、以下の様なディレクトリ構成を挙げます。
image

そして、Resource はバッチファイルで参照されているとします。

この時...

  • Resource フォルダを SSD に持っていって高速化を図りたい!!
  • けど、人によっては SSD が増設されていないので、そういった人はこのままのディレクトリ構成にしておきたい。

このような要望があった場合、どう解決するか?
それは、シンボリックリンクを使えば簡単に解決できます。

  • SSD を持っている人は、Resource フォルダをシンボリックリンクにして、リンク先を SSD に移動させた Resource フォルダにする。
  • SSD を持っていない人は、そのまま。

こうすることで、バッチファイルを修正することなくこの要望に対応することができます。

シンボリックリンクの落とし穴

このように便利に見えるシンボリックリンクですが、一つだけ落とし穴があります。
それは...

ファイルダイアログを使ってシンボリックリンクをたどると、リンク元のパスになってしまう!

ということです。

例として、先ほどの C:\linksrc のシンボリックリンクを挙げます。
このシンボリックリンクをペイントの「開く」ダイアログで辿ってみます。
image

エクスプローラでは、symlink に入ると D:\Workspace\link\symlink を指していましたが、ペイントの「開く」ダイアログで辿ると...
image

なんと、 C:\linksrc を指してしまいました!

この場合、ダイアログから帰ってくるパスも C:\linksrc~ になってしまうので、シンボリックリンクを使う意味がなくなってしまいます。

ジャンクションを使って、落とし穴を回避する

では、この落とし穴をどうやって回避するか?

答えは「ジャンクションを使う」です。

ジャンクションとは、シンボリックリンクと同じ性質を持つ仕組みで、ファイルダイアログを使ってもジャンクションを介したパスが問題なく取得できます。

ただし、シンボリックリンクと比べて、ジャンクションのほうが機能的には劣っています。
具体的には以下のとおりです。

  • 指定できるリンク先はフォルダのみ。
  • ネットワーク上の共有フォルダなど、ローカルでないフォルダはリンク先に指定できない。
  • リンク先に相対パスを指定しても、絶対パスに置換されて設定される。

もし、これらが問題になるのであれば、ジャンクションは使えません。

先の C:\linksrc へのシンボリックリンクの問題はこれらの違いを無視できますので、ジャンクションを使って解決することができました。

ジャンクションの詳しい説明はこちらを記事をご覧ください。