Jak usunąć twardy link Windows NTFS (mklink / h), gdy oryginał jest w użyciu?

10

W systemie plików Windows NTFS mam plik (powiedzmy orig.mp3). Otwieram ten plik za pomocą tej ścieżki orig.mp3w taki sposób, aby był używany (powiedzmy, odtwarzając go w VLC).

Następnie tworzę twardy link ( cmd /c mklink /h link.mp3 orig.mp3). Powoduje to, że dwie ścieżki NTFS wskazują dokładnie ten sam plik.

Wreszcie próbuję ponownie usunąć połączony plik ( del link.mp3lub usunąć w Eksploratorze Windows).

Błąd kończy się niepowodzeniem: „Proces nie może uzyskać dostępu do pliku, ponieważ jest używany przez inny proces”.

Dlaczego? I co ważniejsze: jak mogę tego uniknąć (oprócz upewnienia się, że żaden proces nie używa oryginalnego pliku)? Czy mogę polecić systemowi Windows wykonanie „opóźnionego usunięcia”, aby połączony plik był automatycznie usuwany, gdy oryginał nie jest już używany?

MarnixKlooster ReinstateMonica
źródło
2
Powinien być prawdopodobnie zapytany przez administratora. Ale nadal: plik ruchu powinien być w stanie wykonać lewę w każdym przypadku. Zaskakujące jest to, że nie można po prostu usunąć twardego linku, w rzeczywistości powinien to być całkowicie „niepowiązany” plik.
Damon,

Odpowiedzi:

11

Jest to dość oczekiwane zachowanie, twardy link to po prostu inna nazwa tego samego pliku. Na przykład, jeśli masz plik A.PDF, utwórz twardy link B.PDF do tego samego pliku, nie ma znaczenia, czy plik jest otwierany pod nazwą A.PDF czy B.PDF - nadal jest to ten sam plik, więc jeśli ten plik jest po prostu otwarty, nie możesz usunąć żadnego linku.

Rzeczywistym powodem jest to, że nazwa jest przechowywana jako atrybut w rekordzie pliku głównej tabeli plików (w przypadku NTFS), a ponieważ plik jest otwarty, nie można usunąć żadnego łącza (nie można zmodyfikować otwartego pliku).

W tym przypadku nie ma to jak oryginalny plik, ponieważ obie nazwy należą do tego samego (i jedynego) pliku i obie nazwy są sobie równe. Plik jest faktycznie usuwany, gdy liczba linków osiągnie zero.

Robert Goldwein
źródło
Dzięki za odpowiedź na pytanie „Dlaczego?” Jak widać, dodałem własną odpowiedź na temat „Jak tego uniknąć?”
MarnixKlooster ReinstateMonica
4
„Dlaczego” jest niepełne; jeśli usunięcie dowiązania twardego jest modyfikacją, to także dodanie jednego, ale możesz dodawać dowiązania twarde do otwieranych plików, po prostu nie usuwaj ich ani nie zmieniaj ich nazw. Myślę, że „dlaczego” polega na tym, że zdecydowano, że twardych dowiązań nie można zmienić ani usunąć, gdy plik jest otwarty; celowa decyzja projektowa.
RomanSt
2

Użyj narzędzia FSUTIL, aby bezpiecznie utrzymywać dowiązania symboliczne.

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

fsutil reparsepoint delete link.mp3

usunie hardlink przy zachowaniu orig.mp3

Stavr00
źródło
2
Ale czy działałoby to na twardych linkach? Nie wierzę w to.
Daniel B
Cóż ... Mam to. Error: The process cannot access the file because it is being used by another process.
ST3
zawieść. taki sam jak @ ST3.
Señor CMasMas
1

Jak szczegółowo opisano w odpowiedzi Roberta Goldweina , takiego twardego łącza nie można usunąć, gdy plik jest w użyciu. Opóźnione usuwanie okazuje się jednak możliwe.

Damon komentarz „s na to pytanie sugeruje użycie MoveFile z Sysinternals Suite.

W moim przypadku, gdy chcę to zrobić z PowerShell, mogę użyć Lee Holmesa , aby Windows usunął plik przy następnym uruchomieniu.Move-LockedFilelink.mp3 $null

Oba powyższe wykorzystują funkcję Win32 MoveFileEx z flagą MOVEFILE_DELAY_UNTIL_REBOOT .

Aktualizacja: zobacz https://gist.github.com/marnix/7565364, na Remove-File-Eventuallyktóry właśnie zhackowałem. Brak gwarancji :-)

MarnixKlooster ReinstateMonica
źródło