9

В файловой системе Windows NTFS у меня есть файл (скажем, orig.mp3). Я открываю этот файл через этот путь orig.mp3 таким образом, чтобы он использовался (например, воспроизводя его в VLC).

Затем я создаю жесткую ссылку (cmd /c mklink /h link.mp3 orig.mp3). В результате два пути NTFS указывают на один и тот же файл.

Наконец, я снова пытаюсь удалить связанный файл (del link.mp3 или удалить в проводнике Windows).

Это приводит к ошибке: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».

Зачем? И что еще более важно: как я могу избежать этого (кроме того, чтобы убедиться, что ни один процесс не использует исходный файл)? Могу ли я попросить Windows выполнить «отложенное удаление», чтобы связанный файл автоматически удалялся, когда оригинал больше не используется?

3 ответа3

9

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

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

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

3

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

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

fsutil reparsepoint delete link.mp3

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

1

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .