web-dev-qa-db-ja.com

オリジナルの使用中にWindows NTFSハードリンク(mklink / h)を削除する方法

Windows NTFSファイルシステムでは、ファイルがあります(たとえば、orig.mp3)。私はこのパスを介してこのファイルを開きますorig.mp3、それが使用されているような方法で(たとえば、VLCで再生することによって)。

次に、ハードリンク(cmd /c mklink /h link.mp3 orig.mp3)。これにより、2つのNTFSパスがまったく同じファイルを指します。

最後に、リンクされたファイルをもう一度削除しようとします(del link.mp3、またはWindowsエクスプローラーで削除)。

これはエラーで失敗します。「ファイルが別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。」

どうして?さらに重要なことですが、これを回避するにはどうすればよいですか(元のファイルが使用されているプロセスがないことを確認することは別として)?元のファイルが使用されなくなったときにリンクファイルが自動的に削除されるように、「遅延削除」を実行するようにWindowsに指示できますか?

これは予想される動作であり、ハードリンクは同じファイルの別の名前にすぎません。たとえば、ファイルA.PDFがある場合、同じファイルへのハードリンクB.PDFを作成します。ファイルがA.PDFまたはB.PDFという名前で開かれているかどうかは関係ありません。このファイルは単に開かれるだけで、どちらのリンクも削除できません。

実際の理由は、名前がマスターファイルテーブルのファイルレコードに属性として格納され(NTFSの場合)、ファイルが開かれているため、どちらのリンクも削除できない(開いているファイルを変更できない)ためです。

この場合、両方の名前が同じ(そして唯一の)ファイルに属し、両方の名前が等しいため、元のファイルのようなものはありません。リンク数がゼロになると、ファイルは実際に削除されます。

11
Robert Goldwein

FSUTILツールを使用して、シンボリックリンクを安全に維持します。

http://technet.Microsoft.com/en-ca/library/cc753059.aspx

fsutil reparsepoint delete link.mp3

保存中にハードリンクを削除しますorig.mp3

2
Stavr00

Robert Goldweinの回答 で詳しく説明されているように、このようなハードリンクは、ファイルの使用中は削除できません。ただし、遅延削除は可能であることが判明しました。

この質問に対する Damon のコメントは、Sysinternals Suiteの movefile を使用することを示唆しています。

私の場合、PowerShellからこれを行う場合、Lee Holmesの Move-LockedFilelink.mp3 $nullを使用して、Windowsに次回の起動時にファイルを削除させることができます。

上記の両方は、Win32 MoveFileEx関数を MOVEFILE_DELAY_UNTIL_REBOOT フラグとともに使用します。

更新:Remove-File-Eventuallyについては https://Gist.github.com/marnix/7565364 を参照してください。ちょうどハックアップ。保証なし。 :-)