ジャンクションの罠
2003年3月11日(火曜日)
ジャンクションの罠
ハードリンク/ジャンクション作成ツール (emk.name)で思い出したのでついでにメモしておきますが、ディレクトリに対するジャンクションにはとてつもなく大きな罠があります。
ジャンクションを利用している間は特に問題ありません。しかし、後でジャンクションが不要になり、しかしながら本体のディレクトリとその中のファイルは必要というとき、ジャンクションだけを削除したいと思うことがあります。そのとき、何も考えずにジャンクションを削除してはいけません!
普通にエクスプローラから削除すると、ジャンクションはごみ箱に入ります。この時点ではまだ問題はありません。ジャンクションはごみ箱の中に隠れていますし、本体は普通に利用できますから、目的が達成された状態になっています。
恐ろしいのはここからです。この状態でごみ箱を空にすると……。
ごみ箱を空にした瞬間に、本体の中のファイルが全て消えます。
本気で洒落になりません。しかも、このときファイルの消滅に気づかず、後日になってから気づいたりすると、原因に全く思い至らずにあらぬものに嫌疑をかけてしまうことがあります。……というか、ありました。ごめんなさい。
※おそらくこの原因はごみ箱を空にする処理にあります。ごみ箱を空にするとき、ディレクトリが捨てられていたら、まずはディレクトリ内の全ファイルを削除してからディレクトリを削除するという処理になっているようです。そして、おそらくはこの処理の中で「ディレクトリに対するジャンクション」は何の疑いもなくディレクトリだとみなされていて「ディレクトリの中の全ファイルを削除してからディレクトリを削除する」処理が実行されます。ジャンクションによって「ディレクトリの中のファイル」にアクセスして、対象のファイルをことごとく削除し、そして最後にジャンクションを削除するという結果になります。結果として本体の中のファイルがすべて削除されます。本体のディレクトリ自体は残りますが、それだけ残っても意味ありません。
ちなみに、Shift キーを押しながら「削除」するなどしてごみ箱に入れずに削除した場合、単純にその場で本体内の全ファイルが削除されます。
ディレクトリに対するジャンクションを安全に削除するためには、MS-DOS プロンプトで RD (RMDIR) コマンドを使います。通常は RD では中身のあるディレクトリを削除することはできませんが、ジャンクションなら問題なく削除できます。
※なお DEL コマンドで削除しようとすると、やはりディレクトリの中身をすべて消してしまいます。最近の DOS プロンプトは、DEL コマンドでディレクトリを指定すると、ディレクトリ内のファイル全てを削除しようとするのですね。それ自体知りませんでした。
- 「ジャンクションの罠」にコメントを書く
- 前(古い): スタートメニューの中にフォルダへのショートカットを作る
- 次(新しい): first-line 疑似要素に適用できないプロパティ