Vistaのシンボリックリンク

Vistaシンボリックリンクを調べたくて、今更ながらRC1をVirtual PCにインストールしました。
インストールの所要時間は1時間程度でした。


Vistaシンボリックリンクを作成するには、mklinkというコマンドを使います。
このコマンドはAdministrator権限を必要とするため、「コマンド プロンプト」を起動する際に、ショートカット上で右クリックして、コンテキストメニューから「管理者として実行(A)...」を選んで起動する必要があります。
使用例はこんな感じになります。

C:\Users\hamigaki\Documents>mkdir dir

C:\Users\hamigaki\Documents>mklink /D link dir
link <<==>> dir のシンボリック リンクが作成されました

C:\Users\hamigaki\Documents>type CON > abc.txt
abc
^Z

C:\Users\hamigaki\Documents>mklink link.txt abc.txt
link.txt <<==>> abc.txt のシンボリック リンクが作成されました

C:\Users\hamigaki\Documents>dir
 ドライブ C のボリュームラベルがありません。
 ボリューム シリアル番号は 1C47-04C0 です

 C:\Users\hamigaki\Documents のディレクトリ

2006/11/10  18:33    <DIR>          .
2006/11/10  18:33    <DIR>          ..
2006/11/10  18:32                 5 abc.txt
2006/11/10  18:32    <DIR>          dir
2006/11/10  18:33    <SYMLINKD>     link [dir]
2006/11/10  18:33    <SYMLINK>      link.txt [abc.txt]
               2 個のファイル                   5 バイト
               4 個のディレクトリ   9,620,389,888 バイトの空き領域

Vistaシンボリックリンクは、ディレクトリに対するシンボリックリンク(SYMLINKD)と、ファイルに対するシンボリックリンク(SYMLINK)が明確に区別されています。
そのため、SYMLINKDを作成する場合はmklinkに/Dオプションを指定する必要があります。
削除するのもSYMLINKDはrmdirを使います。


エクスプローラ上では、

のように見えます。
どうも、Vistaシンボリックリンクは、ファイル属性にシンボリックリンク(リパースポイント)が付いただけのただのファイル/ディレクトリで、中身だけ別のところにあるといった感じのもののようです。
実際、タイムスタンプだけでなく、「読み取り専用」や「隠しファイル」といった属性やACLまでターゲットとは別に設定可能です。(ただし、シンボリックリンクの「読み取り専用」やACLはファイルの読み書きの際は無視されるようです。)
POSIXシンボリックリンクが、ターゲットと同じファイル/ディレクトリが存在するかのように見せかけるのに対し、Vistaのそれはターゲットと同じ内容を共有する別ファイル/ディレクトリといった印象です。


また、SYMLINKDのターゲットをファイルにしたり、SYMLINKのターゲットをディレクトリにすることもできますが、オープンできないシンボリックリンクになります。
ちなみに、ファイルに対するSYMLINKDを作って、それに対するSYMLINKも作ってみましたが開けませんでした。
ディレクトリとファイルの不一致はファイルシステムレベルで弾かれているようです。


ちょっと面白いのは、シンボリックリンクにターゲットと別の拡張子をつけると起動するアプリケーションを切り替えることができる点です。
XMLファイルなんかを編集用と閲覧用で別拡張子にしておくと便利かもしれません。
拡張子の付いていないC++標準ヘッダに.hppとかのシンボリックリンクを作るのもよさそうです。