Як видалити жорстке посилання 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 повинен уміти робити трюк у будь-якому випадку. Дивно, що ви не можете просто видалити жорстке посилання, насправді це має бути повністю "не пов'язаний" файл.
Деймон

Відповіді:


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


2
Але чи вдалося б це працювати на жорстких посиланнях? Я не вірю в це.
Даніель Б

Ну ... я зрозумів це. Error: The process cannot access the file because it is being used by another process.
ST3

невдача. те саме, що і @ ST3.
Сеньор CMasМас

1

Як детально зазначено у відповіді Роберта Голдвейна , таке жорстке посилання неможливо видалити, коли файл використовується. Однак затримка видалення виявляється можливою.

У коментарі Демона до цього питання пропонується використовувати файл пересування з програми "Sysinternals Suite".

У моєму випадку, коли я хочу це зробити з PowerShell, я можу використовувати Лі Холмса , щоб Windows видалив файл при наступному завантаженні.Move-LockedFilelink.mp3 $null

Обидва згаданих вище використовують функцію Win32 MoveFileEx з прапором MOVEFILE_DELAY_UNTIL_REBOOT .

Оновлення: Див. Https://gist.github.com/marnix/7565364, за Remove-File-Eventuallyякий я щойно зламався. Ніяких гарантій. :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.