使用原始格式时如何删除Windows NTFS硬链接(mklink / h)?


10

在Windows NTFS文件系统上,我有一个文件(例如orig.mp3)。我通过此路径orig.mp3以使用该文件的方式打开该文件(例如,通过在VLC中播放该文件)。

然后,我创建一个硬链接(cmd /c mklink /h link.mp3 orig.mp3)。这将导致两个NTFS路径指向完全相同的文件。

最后,我尝试再次删除链接的文件(del link.mp3,或在Windows资源管理器中删除)。

失败并显示错误:“该进程无法访问该文件,因为该文件正在被另一个进程使用。”

为什么?更重要的是:如何避免这种情况(除了确保没有进程使用原始文件之外)?也许我可以告诉Windows执行“延迟删除”,以便在不再使用原始文件时自动删除链接的文件吗?


2
可能应该问超级用户。但是,无论如何,movefile应该能够解决问题。令人惊讶的是,您不能简单地删除硬链接,实际上它应该是一个完全“无关”的文件。
达蒙

Answers:


11

这是完全正常的行为,硬链接只是同一文件的另一个名称。例如,如果您有文件A.PDF,则将硬链接B.PDF创建到同一文件,无论文件是以A.PDF还是B.PDF的名称打开都没有关系-它仍然是同一文件,因此如果只需打开该文件,就不能删除任何链接。

实际原因是该名称作为属性存储在主文件表的文件记录中(对于NTFS),并且由于该文件已打开,因此您无法删除任何链接(无法修改打开的文件)。

在这种情况下,没有什么比原始文件更合适的了,因为两个名称都属于同一个(也是唯一一个)文件,并且两个名称相同。当链接计数达到零时,该文件实际上被删除。


感谢您回答“为什么?” 如您所见,我在“如何避免?”上添加了自己的答案。
MarnixKlooster恢复状态莫妮卡

4
“为什么”不完整;如果删除硬链接是一种修改,那么添加硬链接也是这样,但是您可以添加硬链接来打开文件,而不必删除或重命名它们。我认为“原因”只是因为确定打开文件时不能重命名或删除硬链接。故意的设计决定。
2014年


1

Robert Goldwein的答案中所述,在使用文件时无法删除这样的硬链接。但是,事实证明延迟删除是可能的。

Damon对这个问题的评论建议使用Sysinternals Suite中的movefile

就我而言,要从PowerShell进行此操作,可以使用Lee Holmes的,让Windows在下次启动时删除该文件。Move-LockedFilelink.mp3 $null

以上两个都使用带有MOVEFILE_DELAY_UNTIL_REBOOT标志的Win32 MoveFileEx函数。

更新:请参见https://gist.github.com/marnix/7565364Remove-File-Eventually,我只是砍死了。没有保证。:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.