В файловой системе Windows NTFS у меня есть файл (скажем, orig.mp3
). Я открываю этот файл через этот путь orig.mp3
таким образом, чтобы он использовался (скажем, воспроизводя его в VLC).
Затем я создаю жесткую ссылку ( cmd /c mklink /h link.mp3 orig.mp3
). В результате два пути NTFS указывают на один и тот же файл.
Наконец, я снова пытаюсь удалить связанный файл ( del link.mp3
или удалить в проводнике Windows).
Это приводит к ошибке: «Процесс не может получить доступ к файлу, потому что он используется другим процессом».
Почему? И что еще более важно: как я могу избежать этого (кроме того, чтобы убедиться, что ни один процесс не использует исходный файл)? Могу ли я попросить Windows сделать «отложенное удаление», чтобы связанный файл автоматически удалялся, когда оригинал больше не используется?
Ответы:
Это вполне ожидаемое поведение, жесткая ссылка - это просто другое имя для того же файла. Например, если у вас есть файл A.PDF, создайте жесткую ссылку B.PDF на тот же файл, не имеет значения, открывается ли файл под именем A.PDF или B.PDF - это все тот же файл, так что если этот файл просто открыт, вы не можете удалить ни одну ссылку.
Фактическая причина заключается в том, что имя хранится в виде атрибута в записи файла таблицы основных файлов (в случае NTFS), и поскольку файл открыт, вы не можете удалить ни одну ссылку (вы не можете изменить открытый файл).
В этом случае нет ничего похожего на исходный файл, поскольку оба имени принадлежат одному и тому же (и единственному) файлу, и оба имени равны. Файл фактически удаляется, когда счетчик ссылок достигает нуля.
источник
Используйте инструмент FSUTIL для безопасного обслуживания символических ссылок.
http://technet.microsoft.com/en-ca/library/cc753059.aspx
удалил бы жесткую ссылку, сохраняя orig.mp3
источник
Error: The process cannot access the file because it is being used by another process.
Как подробно описано в ответе Роберта Голдвейна , такая жесткая ссылка не может быть удалена во время использования файла. Однако отложенное удаление оказывается возможным.
Комментарий Дэймона по этому вопросу предлагает использовать movefile из Sysinternals Suite.
В моем случае, когда я хочу сделать это из PowerShell, я могу использовать Lee Holmes's , чтобы Windows удалила файл при следующей загрузке.
Move-LockedFile
link.mp3 $null
Оба из вышеперечисленного используют функцию Win32 MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT .
Обновление: См https://gist.github.com/marnix/7565364 для
Remove-File-Eventually
которых я только что изрубил. Нет гарантий. :-)источник