Windowsを始め、多くのOSにはファイルの「リンク」機能がある
Windowsに限らず、多くのOSが持つファイルシステムには「リンク」と呼ばれる機能がある。ファイルは、パスにより一意に特定可能だが、人間がファイルを管理するとき、どうしても同じファイルを別の場所(パス)にも配置したくなることがある。これを実現するのがリンクだ。リンクには、大きく「ハードリンク」と「ソフトリンク」(あるいはシンボリックリンクともいう)の2種類がある。
ファイルシステムには、ファイル名を管理するディレクトリ領域とファイルの中身を記録する領域がある。ハードリンクはこの仕組みを利用して、同じファイルの中を指し示すファイル名を異なるパスに作る。
特徴として、後から作ったハードリンクもオリジナルのファイル名も区別がなく、どちらも同じファイルとして扱える。通常は、ファイルシステム側に「参照カウント」と呼ばれる情報があり、リンクが作られるごとにこれが増えていき、削除されると参照カウントが減っていく。参照カウントが0になると、ファイルそのものが消去される。
これに対して、ソフトリンクはOSがファイルシステム内に置かれた特殊なファイルを処理して、ファイルがあたかもそこにあるかのように振る舞うものだ。APIのレベルでは同等だが、ファイルシステム上はハードリンクと異なり、あくまでもOSのファイルAPI内での処理が必要になる。
このため、異なるファイルシステムやネットワークを使った共有ファイルシステムともリンクが可能になるというメリットがある反面、リンクされている側とリンク側にはお互いに関係がなく、リンク先が削除されると、存在しないものを指し示すリンクになってしまうことがある。
さて、WindowsのNTFSには、以下の表のようなリンクがある。
これまでWindowsのファイルリンクに関しては、きちんと説明していなかったので、ここであらためて解説しておこう。確認事項としては、Windowsのドライブやディレクトリなどの用語があるが、これに関しては、(「Windowsにおける『パス』を改めて考える」)を参照してほしい。
NTFSは、Windows 2000からハードリンクとジャンクションが利用可能になった。その後、Windows Vistaでシンボリックリンクがサポートされている。標準的な意味でのファイルリンクではないが、Windowsは、Windows 95からファイルショートカット(シェルリンク)がある。これは、シェル(エクスプローラー)のレベルで実現されているソフトリンクの1種である。シェルリンクはエクスプローラー上でのみ有効で、エクスプローラーのコンテキストメニューなどで作成する。
実際にWindows上でリンクを作成する
リンクを作成するには、cmd.exeではmklinkコマンドを、PowerShell/Windows PowerShellでは、New-Itemコマンドを使う。
mklinkコマンドはcmd.exeの内部コマンドなので、cmd.exe以外から利用する場合には、「cmd.exe /c mklink 引数」として呼び出す必要がある。しかし、リンクにパスを指定できるため、カレントディレクトリに関わりなく、他のディレクトリにリンクを作成できる。これに対して、PowerShellのNew-Itemコマンドでは、-Nameオプションに指定できるのはリンクの名前だけで、カレントディレクトリ以外にリンクを作成する場合、別途-Pathオプションを使って作成先ディレクトリを指定する必要がある。
なお、シェルリンクに関しては、手動操作による作成が基本だが、コマンドラインから行うことは不可能ではない。具体的には、以下のようにWScript.Shellオブジェクトを使う。リンクパスは、リンク名に必ず拡張子「.lnk」を付ける。
$s=(New-Object -ComObject WScript.Shell).CreateShortcut("リンクパス")
$s.TargetPath="ターゲットパス"
$s.Save()

WScript.Shellオブジェクトを使うことで、PowerShellからシェルリンク(ファイル・ショートカット)を作成できる。シェルリンクは、エクスプローラー上ではリンクとなるが、コマンドラインなど、エクスプローラー外からは単なるファイルにしか見えない
1行目の「リンクパス」、2行目の「ターゲットパス」は、どちらもフルパスを指定する必要がある。なお、このコマンドであれば、現在は存在しないファイル/フォルダへのリンクを作成できる。

この連載の記事
-
第407回
PC
2025年以降もWindows 10に延長サポートがある可能性!? 対応ハードを絞る真の本命は次期Windows? -
第406回
PC
Windowsにおける言語設定とは -
第405回
PC
WSLプレビューVer.2.0.7でMirroredネットワーク、DNSトンネリングを試す -
第404回
PC
開発者向けに性能が高い、Windowsの「開発ドライブ」を試す -
第403回
PC
WSL Ver.2.0の新機能「自動メモリ回収」を実際に試す -
第402回
PC
プレビュー版が登場したWSLのVer.2.0 新機能を具体的に見る -
第401回
PC
内部的な改良で便利になったWindows Terminal v1.19での新機能を確認 -
第400回
PC
Windowsにおける音声認識など、ボイス機能を整理 -
第399回
PC
Windowsではプロセスからプログラムに関するさまざまな情報が得られる -
第398回
PC
Windows Subsystem for Androidの進化を確認 エクスプローラーからのファイルのドラッグ&ドロップが可に -
第397回
PC
Windowsにおけるディスク、ドライブ、パーティションの扱いの違い - この連載の一覧へ