シンボリックリンクおよびジャンクションそしてハードリンク

POSIXでは必須ながら、Windows環境では滅多に使わないシンボリックリンク。

なので、たまにおさらいしておく。

参考:シンボリック リンクの作成

元々WindowsでPOSIXの/mntのような機能を実現するためにNTFSに実装されたジャンクション機能が基になっている。

Windows 2000で使えるようになったのはジャンクションとハードリンクだけで、シンボリックリンクはVista世代まで利用できない。mklinkコマンド自体がVistaで搭載されたもので、2000, XPでジャンクションやハードリンクを使うにはmountvolコマンドやfsutilコマンドを使う。

昔のことすぎてよく覚えないないが、2000,XP時代のジャンクションはエクスプローラから削除しようとすると実体が削除される、とても使い難い危険な機能だった記憶がある。

シンボリックリンク

ファイルへリンクする場合。

mklink [link name(to)] [target file name(from)]

リンク削除(エクスプローラから普通に削除しても大丈夫)

del [link name]

ディレクトリへリンクする場合。

mklink /d [link name(to)] [target dir name(from)]

リンク削除(エクスプローラから普通に削除しても大丈夫)

rmdir [link name]

dirコマンドではリンク先がファイルの場合は<SYMLINK>、ディレクトリの場合は<SYMLINKD>と表示される。

エクスプローラではリンク先がファイルの場合は表示される種類は.symlinkとなるが、ディレクトリの場合は通常のフォルダと同様にファイル フォルダーと表示される。 リンク側ではリンク先のファイルサイズは判らない(プロパティなどでは0バイトと表示される)

リンク作成後に元のファイルやディレクトリを削除してもリンクは残るが、アクセスしようとするとショートカットの場合と同様に「場所が見つからない」や「ファイルが見つかりません」といった旨を知らせるダイアログが表示され、リンク先にアクセスする事はできなくなる。

ディレクトリに張ったシンボリックリンク内のファイルにシンボリックリンクを張った場合、ディレクトリへのシンボリックリンクを削除すると同じ対象に同じ名前でシンボリックリンクを張ったとしても内部のファイルへのシンボリックリンクは無効のまま。

ネットワークドライブ上のファイル、ディレクトリに対してもリンクを張れる。

Administratorsグループのメンバー、またはSeCreateSymbolicLinkPrivilege特権を持つユーザーが作成できる。

ジャンクション・ポイント

リンク作成。

mklink /j [link name(to)] [target file name(from)]

リンク削除(エクスプローラから普通に削除しても大丈夫)

rmdir [link name]

正確にはディレクトリジャンクション。ディレクトリのみを対象としたシンボリックリンク的なものを作る。

dirコマンドでは<JUNCTION>と表示される。

特権不要で作成できる。

ドライブを超えたリンクを張れるがネットワークドライブ上のディレクトリへのリンクは張れず「ローカル ボリュームは、操作を完了する必要があります。」とエラーが表示される。

ハードリンク

リンク作成。

mklink /h [link name(to)] [target file name(from)]

リンク削除(エクスプローラから普通に削除しても大丈夫)

del [link name]

同一ドライブ内でのみ利用可能なリンク。別ドライブのファイルを対象にしようとすると「ローカル NTFS ボリュームは、操作を完了する必要があります。」などとエラーが表示される。

ファイル実体への参照を増やすので、リンク作成後に元のファイルを削除してもファイル実体は残っておりアクセス可能。ディレクトリへのリンクは作成できない。

特権不要で作成できる。