Как удалить жесткую ссылку 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 сделать «отложенное удаление», чтобы связанный файл автоматически удалялся, когда оригинал больше не используется?

MarnixKlooster ReinstateMonica
источник
2
Наверное, стоит спросить у суперпользователя. Но все же: movefile должен быть в состоянии добиться цели в любом случае. Удивительно, что вы не можете просто удалить жесткую ссылку, хотя на самом деле это должен быть полностью «не связанный» файл.
Деймон

Ответы:

11

Это вполне ожидаемое поведение, жесткая ссылка - это просто другое имя для того же файла. Например, если у вас есть файл A.PDF, создайте жесткую ссылку B.PDF на тот же файл, не имеет значения, открывается ли файл под именем A.PDF или B.PDF - это все тот же файл, так что если этот файл просто открыт, вы не можете удалить ни одну ссылку.

Фактическая причина заключается в том, что имя хранится в виде атрибута в записи файла таблицы основных файлов (в случае NTFS), и поскольку файл открыт, вы не можете удалить ни одну ссылку (вы не можете изменить открытый файл).

В этом случае нет ничего похожего на исходный файл, поскольку оба имени принадлежат одному и тому же (и единственному) файлу, и оба имени равны. Файл фактически удаляется, когда счетчик ссылок достигает нуля.

Роберт Голдвейн
источник
Спасибо за этот ответ "Почему?" Как видите, я добавил свой собственный ответ на вопрос «Как избежать?»
MarnixKlooster ReinstateMonica
4
«Почему» является неполным; если удаление жесткой ссылки является модификацией, то добавляется и такая, но вы можете добавить жесткие ссылки для открытия файлов, но не удалять и не переименовывать их. Я думаю, что «почему» просто было решено, что жесткие ссылки не могут быть переименованы или удалены, пока файл открыт; намеренное дизайнерское решение.
RomanSt
2

Используйте инструмент FSUTIL для безопасного обслуживания символических ссылок.

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

fsutil reparsepoint delete link.mp3

удалил бы жесткую ссылку, сохраняя orig.mp3

Stavr00
источник
2
Но будет ли это работать на жестких ссылках? Я не верю в это.
Даниэль Б
Ну ... Я понял это. Error: The process cannot access the file because it is being used by another process.
ST3
потерпеть поражение. так же, как @ ST3.
Сеньор CMasMas
1

Как подробно описано в ответе Роберта Голдвейна , такая жесткая ссылка не может быть удалена во время использования файла. Однако отложенное удаление оказывается возможным.

Комментарий Дэймона по этому вопросу предлагает использовать movefile из Sysinternals Suite.

В моем случае, когда я хочу сделать это из PowerShell, я могу использовать Lee Holmes's , чтобы Windows удалила файл при следующей загрузке.Move-LockedFilelink.mp3 $null

Оба из вышеперечисленного используют функцию Win32 MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT .

Обновление: См https://gist.github.com/marnix/7565364 для Remove-File-Eventuallyкоторых я только что изрубил. Нет гарантий. :-)

MarnixKlooster ReinstateMonica
источник