Bagaimana cara menghapus tautan Windows NTFS (mklink / h) saat dokumen asli sedang digunakan?

10

Pada sistem file Windows NTFS, saya punya file (katakanlah, orig.mp3). Saya membuka file ini, melalui jalur ini orig.mp3, sedemikian rupa sehingga digunakan (katakanlah, dengan memainkannya dalam VLC).

Lalu saya membuat tautan keras ( cmd /c mklink /h link.mp3 orig.mp3). Ini menghasilkan dua jalur NTFS yang menunjuk ke file yang persis sama.

Akhirnya saya mencoba menghapus file tertaut lagi ( del link.mp3, atau menghapus di Windows Explorer).

Ini gagal dengan kesalahan: "Proses tidak dapat mengakses file karena sedang digunakan oleh proses lain."

Mengapa? Dan yang lebih penting: bagaimana saya bisa menghindari ini (selain memastikan tidak ada proses memiliki file asli digunakan)? Dapatkah saya memberi tahu Windows untuk melakukan 'penghapusan tertunda', sehingga file yang ditautkan dihapus secara otomatis ketika dokumen asli tidak lagi digunakan?

MarnixKlooster ReinstateMonica
sumber
2
Mungkin harus ditanyakan pada pengguna super. Tapi tetap saja: movefile harus bisa melakukan trik dalam hal apa pun. Mengejutkan bahwa Anda tidak bisa begitu saja menghapus tautan keras, sebenarnya itu seharusnya berkas yang benar-benar "tidak berhubungan".
Damon

Jawaban:

11

Ini perilaku yang sangat diharapkan, tautan keras hanyalah nama lain untuk file yang sama. Misalnya, jika Anda memiliki file A.PDF, buat tautan keras B.PDF ke file yang sama, tidak masalah apakah file dibuka dengan nama A.PDF atau B.PDF - itu masih file yang sama, jadi jika file ini hanya dibuka, Anda tidak dapat menghapus tautan mana pun.

Alasan sebenarnya adalah bahwa nama tersebut disimpan sebagai atribut dalam catatan file tabel file master (dalam kasus NTFS) dan karena file dibuka, Anda tidak dapat menghapus salah satu tautan (Anda tidak dapat mengubah file yang dibuka).

Dalam hal ini tidak ada yang seperti file asli, karena kedua nama tersebut milik file yang sama (dan satu-satunya) dan kedua nama sama. File sebenarnya dihapus ketika jumlah tautan mencapai nol.

Robert Goldwein
sumber
Terima kasih atas jawaban untuk "Mengapa?" Seperti yang Anda lihat, saya telah menambahkan jawaban saya sendiri pada "Bagaimana cara menghindari?"
MarnixKlooster ReinstateMonica
4
"Mengapa" tidak lengkap; jika menghapus hardlink adalah modifikasi, maka tambahkan juga, namun Anda dapat menambahkan hardlink untuk membuka file, hanya saja tidak menghapus atau mengganti nama mereka. Saya pikir "mengapa" hanya diputuskan bahwa hardlink tidak dapat diubah namanya atau dihapus saat file dibuka; keputusan desain yang disengaja.
RomanSt
2

Gunakan alat FSUTIL untuk menjaga symlink dengan aman.

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

fsutil reparsepoint delete link.mp3

akan menghapus hardlink sambil mempertahankan orig.mp3

Stavr00
sumber
2
Tetapi apakah ini akan bekerja pada tautan keras? Saya tidak percaya begitu.
Daniel B
Yah ... aku dapat ini. Error: The process cannot access the file because it is being used by another process.
ST3
gagal. sama dengan @ ST3.
Señor CMasMas
1

Seperti dijelaskan dalam jawaban Robert Goldwein , tautan keras semacam itu tidak dapat dihapus saat file sedang digunakan. Namun, penghapusan yang tertunda ternyata dimungkinkan.

Komentar Damon tentang pertanyaan ini menyarankan untuk menggunakan movefile dari Sysinternals Suite.

Dalam kasus saya, di mana saya ingin melakukan ini dari PowerShell, saya dapat menggunakan Lee Holmes's , untuk membuat Windows menghapus file pada boot berikutnya.Move-LockedFilelink.mp3 $null

Kedua hal di atas menggunakan fungsi Win32 MoveFileEx dengan bendera MOVEFILE_DELAY_UNTIL_REBOOT .

Pembaruan: Lihat https://gist.github.com/marnix/7565364 untuk Remove-File-Eventuallyyang baru saja saya retas. Tidak ada jaminan :-)

MarnixKlooster ReinstateMonica
sumber