Làm cách nào để xóa liên kết cứng Windows NTFS (mklink / h) trong khi bản gốc đang được sử dụng?


10

Trên một hệ thống tập tin NTFS của Windows, tôi có một tập tin (ví dụ orig.mp3). Tôi mở tệp này, thông qua đường dẫn này orig.mp3, theo cách mà nó đang được sử dụng (giả sử, bằng cách phát nó trong VLC).

Sau đó, tôi tạo một liên kết cứng ( cmd /c mklink /h link.mp3 orig.mp3). Điều này dẫn đến hai đường dẫn NTFS chỉ chính xác cùng một tệp.

Cuối cùng, tôi cố gắng xóa tệp được liên kết lại ( del link.mp3hoặc xóa trong Windows Explorer).

Điều này không thành công với một lỗi: "Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác."

Tại sao? Và quan trọng hơn: làm thế nào tôi có thể tránh điều này (ngoài việc đảm bảo không có quy trình nào có tệp gốc đang sử dụng)? Có lẽ tôi có thể yêu cầu Windows thực hiện 'xóa chậm', để tệp được liên kết tự động bị xóa khi bản gốc không còn được sử dụng?


2
Có lẽ nên được hỏi về superuser. Nhưng vẫn: movefile sẽ có thể thực hiện thủ thuật trong mọi trường hợp. Thật đáng ngạc nhiên khi bạn không thể đơn giản xóa liên kết cứng, thực ra nó phải là một tệp hoàn toàn "không liên quan".
Damon

Câu trả lời:


11

Đây là hành vi khá được mong đợi, liên kết cứng chỉ là một tên khác cho cùng một tệp. Ví dụ: nếu bạn có tệp A.PDF, hãy tạo liên kết cứng B.PDF cho cùng một tệp, không quan trọng việc tệp được mở dưới tên A.PDF hay B.PDF - đó vẫn là cùng một tệp, vì vậy nếu tập tin này được mở một cách đơn giản, bạn không thể xóa một trong hai liên kết.

Lý do thực tế là tên được lưu trữ dưới dạng một thuộc tính trong bản ghi tệp của bảng tệp chính (trong trường hợp là NTFS) và vì tệp được mở, bạn không thể xóa một trong hai liên kết (bạn không thể sửa đổi tệp đã mở).

Trong trường hợp này, không có gì giống như tệp gốc, vì cả hai tên thuộc về cùng một tệp (và duy nhất) và cả hai tên đều bằng nhau. Các tập tin thực sự bị xóa khi số lượng liên kết đến không.


Cảm ơn câu trả lời này cho "Tại sao?" Như bạn có thể thấy, tôi đã thêm câu trả lời của riêng mình vào "Cách tránh?"
MarnixKlooster RebstateMonica

4
"Tại sao" không đầy đủ; nếu xóa một liên kết cứng là một sửa đổi, thì việc thêm một liên kết cũng vậy, nhưng bạn có thể thêm các liên kết cứng để mở tệp, chỉ cần không xóa hoặc đổi tên chúng. Tôi nghĩ rằng "tại sao" chỉ là quyết định rằng các liên kết cứng không thể được đổi tên hoặc xóa trong khi tệp được mở; một quyết định thiết kế có chủ ý.
RomanSt

2

Sử dụng công cụ FSUTIL để duy trì các liên kết tượng trưng một cách an toàn.

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

fsutil reparsepoint delete link.mp3

sẽ xóa liên kết cứng trong khi bảo quản orig.mp3


2
Nhưng điều này sẽ làm việc trên các liên kết cứng? Tôi không tin như vậy.
Daniel B

Chà ... tôi hiểu rồi Error: The process cannot access the file because it is being used by another process.
ST3

Thất bại. giống như @ ST3.
Señor CMasMas

1

Như chi tiết trong câu trả lời của Robert Goldwein , một liên kết cứng như vậy không thể bị xóa trong khi sử dụng tệp. Tuy nhiên, xóa chậm trễ hóa ra là có thể.

Nhận xét của Damon về câu hỏi này gợi ý sử dụng movefile từ Sysiternals Suite.

Trong trường hợp của tôi, nơi tôi muốn làm điều này từ PowerShell, tôi có thể sử dụng Lee Holmes , để Windows xóa tệp ở lần khởi động tiếp theo.Move-LockedFilelink.mp3 $null

Cả hai cách trên đều sử dụng hàm Win32 MoveFileEx với cờ MOVEFILE_DELAY_UNTIL_REBOOT .

Cập nhật: Xem https://gist.github.com/marnix/7565364 để Remove-File-Eventuallybiết tôi vừa hack. Không đảm bảo. :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.