ハードリンクとシンボリックリンクの違い

フォルダの参照を示すリンクにハードリンクとシンボリックリンクが存在します。
ただただパソコンを使ってるだけであればまったく触れることのない機能なのですが、ときによっては使用しないといけない場面も出てくるでしょう。
まずはハードリンクとシンボリックリンクの特徴やそれぞれ何が違うのか解説します。
ハードリンクとは?
ハードリンクとは、実際に存在するファイルを参照するリンクのことをいいます。ハードリンクが作成されたファイルは、通常のファイル名とは別の名前にしたとしても、参照先のファイルが同じであるため、オリジナルのファイルと全く同じようにアクセスすることができます。
この際、リファレンスカウントというファイルが参照されている回数が1カウント増えるようになり、必ず参照箇所が記録されるようになってます。
ハードリンクは参照先のファイルが存在している前提のリンクですが、一番最初にあった元のファイルを削除してもファイルは完全に削除されません。そのファイルにアクセスできるリンクが別の名前で存在するので、ハードリンクがある限りそのファイルにアクセスすることができるのです。
シンボリックリンクとは?
シンボリックリンクはファイルだけでなく、フォルダも指定できるリンクの種類の一つです。
一言でいうと右クリックメニューで作成できるショートカットリンク(ジャンクション)の上位版に近いリンクとなっています。指定方法も絶対パスだけでなく相対パスを使えるためリンク先の指定方法の柔軟性がとても高くなってます。
ただし相対パスで指定する際は注意が必要で、相対パスで作成したシンボリックリンクを別のフォルダに移動させると機能しなくなります。シンボリックリンクの保存場所を変更する前提で作成する場合は絶対パスおよびルート相対バスで指定するようにしましょう。
両者の違い

ハードリンクとシンボリックリンクは、明確に区別して理解しようとすると難しい問題です。ですので、簡単に分かりやすい違いを中心に見ていきましょう。
ファイル実在の有無
ハードリンクはアクセス手段(リンク)を増やすものであり、元のファイルを削除してもハードリンクがある限りアクセスすることができます。
それに対してシンボリックリンクは、元のファイルやフォルダが実在していないとアクセスすることができず、ファイルオープンなどで失敗します。
ファイルが移動したときの処理
ファイルが元あるフォルダから別のフォルダに移動してファイルパスが変わってしまったとき、ハードリンクとシンボリックリンクによって動作が異なります。
ハードリンクの場合は、絶対パスや相対パスを気にする必要が全くないためハードリンクを勝手に移動させても問題ありません。
ですが、シンボリックリンクの場合は変わってきます。シンボリックリンクはファイルにアクセスするためのパスを記憶しているだけであり、ハードリンクと違って直接アクセスできるリンクではありません。
そのため、元ファイルが保存されているフォルダーが変わってしまうとシンボリックリンクが機能せず、ファイルアクセスが拒否されてしまいます。
ハードリンクとシンボリックリンクの作成方法

Windowsでハードリンクシンボリックリンクを作成する場合、コマンドプロンプトを使用します。エクスプローラーから作成することはできませんので注意してください。
右クリックから作成できるショートカットはシンボリックリンクならではと思うかもしれませんが、厳密には異なっています。
ハードリンク・シンボリックリンクどちらもコマンドプロンプトを使うのであらかじめ起動しておいてください。
ハードリンク
ハードリンクを作成できるコマンドは2種類あります。昔から使われているコマンドが「fsutil hardlink create」です。コマンド名が長くて覚えづらいのが欠点です。
ですが、最新のWindos10ではもっとカンタンで覚えやすいコマンド「mklink」でも作成できるようになっています。
後述するシンボリックリンクの作成でもmklinkを使うので、覚えるコマンド数を減らすことを考えるとmklinkを使う方がおすすめです。ですので今回はmklinkコマンドを使った方法を紹介します。
mklinkコマンドでハードリンクを作成する構文は以下のとおり。
mklink /H ハードリンク名 作成元のファイルパス
例えば1.pngのハードリンク「copy.png」を作成したい場合は以下のように入力して実行します。
mklink /H copy.png 1.png

「/H」がハードリンクの作成を示すオプションであり、このオプションを忘れるとシンボリックリンクとして作成されてしまいますので注意しましょう。
シンボリックリンク
シンボリックリンクを作成する場合はmklinkコマンドを使用します。
mklinkコマンドでシンボリックリンクを作成する構文は以下のとおり。
mklink シンボリックリンク名 作成元のファイル・フォルダパス
利用できるオプションがいくつかありますが、ファイルのシンボリックリンク・ディレクトリのシンボリックリンク、どちらを作成するかによって適用するオプションの有無が異なります。
まず、ファイルのシンボリックリンクを作成する場合は、他にもオプションを付けません。シンボリックリンクを作成したいファイルのパスとシンボリックリンク名を指定します。
mklink /D シンボリックリンク名 作成元のファイルパス


フォルダシンボリックリンクを作成したい場合は「/D」オプションを付けた上で同じ流れでmklinkコマンドで作成しましょう。
mklink /D シンボリックリンク名 作成元のフォルダパス
フォルダ名の指定などを間違えなければ作成されます。

シンボリックリンクを作成する場合はこれだけ覚えておけば十分です。フォルダのシンボリックリンク作成時は「/D」をつけるということだけ忘れないようにしてくださいね。