W systemie plików Windows NTFS mam plik (powiedzmy orig.mp3
). Otwieram ten plik za pomocą tej ścieżki orig.mp3
w 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.mp3
lub 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?
Odpowiedzi:
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.
źródło
Użyj narzędzia FSUTIL, aby bezpiecznie utrzymywać dowiązania symboliczne.
http://technet.microsoft.com/en-ca/library/cc753059.aspx
usunie hardlink przy zachowaniu orig.mp3
źródło
Error: The process cannot access the file because it is being used by another process.
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-LockedFile
link.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-Eventually
który właśnie zhackowałem. Brak gwarancji :-)źródło