Windows Vistaでのシンボリックリンク
Windows Vistaでは、シンボリックリンクへの対応がOSのいろいろなところで行われている。
最初に取り上げるべきは、mklinkコマンドだろう。
MKLINK [[/D] | [/H] | [/J]] リンク ターゲット /D ディレクトリのシンボリック リンクを作成します。既定では、 ファイルのシンボリック リンクが作成されます。 /H シンボリック リンクではなく、ハード リンクを作成します。 /J ディレクトリ ジャンクションを作成します。 リンク 新しいシンボリック リンク名を指定します。 ターゲット 新しいリンクが参照するパス (相対または絶対) を指定します。
シンボリックリンクは、なぜか、管理者権限がないと使えないようだ。従来のジャンクションと、シンボリックリンクは明らかに対応が違う。このコマンドを使って、ディレクトリに対するシンボリックリンク、ジャンクション、および、ファイルに対する相対シンボリックリンク、絶対シンボリックリンク、ジャンクションを作成してみた。
見てわかるようにエクスプローラは、シンボリックリンク、ジャンクションをちゃんと認識している。面白いのは、ファイルへのジャンクション(test_j.jpg)は、フォルダみたいな表示になっていること。そして、このジャンクションは全く機能しない。
ダブルクリックしてもアクセスできない。
ジャンクションで苦い思い出のある僕のような人はここで、ディレクトリのジャンクション、シンボリックリンクの削除実験を行うのだが、Vistaではゴミ箱への移動、直接削除のいずれでも何の問題も起きなかった。ちゃんとオリジナルの中のファイルは温存される。
次にディレクトリ群のプロパティを見てみる。
シンボリックリンク(dirsymlink)はショートカットの詳細が表示され、リンク先がわかるのに対して、ジャンクションでは、それはできていない。やはり、ここでもジャンクションへの対応が手抜きに見える。
つぎにファイル群のプロパティ。
ここまで並べておいて結論が簡単で悪いが、エクスプローラからは、絶対リンク(test_sa)、相対リンク(test_sr)の区別はつかない。実は、dirコマンドならば簡単に区別がつく。(微妙に個人情報が漏れているのはご愛敬。敢えて晒しておく)
C:\Users\kawasaki\Desktop\symlink_test>dir ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は 1402-299C です C:\Users\kawasaki\Desktop\symlink_test のディレクトリ 2006/11/28 17:31 <DIR> . 2006/11/28 17:31 <DIR> .. 2006/11/28 17:24 <JUNCTION> dirjunction [C:\Users\kawasaki\Desktop\symlink_test\original] 2006/11/28 17:24 <SYMLINKD> dirsymlink [original] 2006/11/28 17:15 <DIR> original 2006/11/28 17:18 24,198 test.jpg 2006/11/28 17:18 24,198 test_h.jpg 2006/11/28 17:31 <JUNCTION> test_j.jpg [C:\Users\kawasaki\Desktop\symlink_test\test.jpg] 2006/11/28 17:29 <SYMLINK> test_sa.jpg [c:\Users\kawasaki\Desktop\symlink_test\test.jpg] 2006/11/28 17:25 <SYMLINK> test_sr.jpg [test.jpg] 4 個のファイル 48,396 バイト 6 個のディレクトリ 25,039,998,976 バイトの空き領域
あと、追加情報としては、シンボリックリンクは、ネットワーク上の共有に対しても張ることができる。
ということで、Vista上では、コマンドラインさえ使えれば、シンボリックリンクに対するOS側のサポートはそんなに悪くないということのようだ。
問題点をまとめると次のようなものだろうか。
- エクスプローラ上でシンボリックリンクが張れない(シェルエクステンションがほしい)
- ジャンクションのサポートには消極的なようだ(シンボリックリンクを使えと言うこと?)
- 非管理者では、シンボリックリンクは作れない
- シンボリックリンクの相対、絶対の区別がエクスプローラ上ではつかない
ということで、Windows Vista用のリンク作成シェル拡張を作成する必要があるなぁと考えている最中です。