Come eliminare l'hard link di Windows NTFS (mklink / h) mentre l'originale è in uso?


10

Su un file system Windows NTFS, ho un file (diciamo, orig.mp3). Apro questo file, attraverso questo percorso orig.mp3, in modo tale che sia in uso (diciamo, riproducendolo in VLC).

Quindi creo un collegamento reale ( cmd /c mklink /h link.mp3 orig.mp3). Ciò comporta due percorsi NTFS che puntano esattamente allo stesso file.

Alla fine provo a cancellare di nuovo il file collegato ( del link.mp3o eliminare in Esplora risorse).

Questo non riesce con un errore: "Il processo non può accedere al file perché è utilizzato da un altro processo."

Perché? E ancora più importante: come posso evitarlo (a parte assicurarsi che nessun processo abbia in uso il file originale)? Posso forse dire a Windows di eseguire un '"eliminazione ritardata", in modo che il file collegato venga automaticamente eliminato quando l'originale non è più in uso?


2
Probabilmente dovrebbe essere chiesto al superutente. Ma comunque: movefile dovrebbe essere in grado di fare il trucco in ogni caso. È sorprendente che non si possa semplicemente eliminare il collegamento reale, in realtà dovrebbe essere un file completamente "non correlato".
Damon,

Risposte:


11

Questo è un comportamento abbastanza previsto, l'hard link è solo un altro nome per lo stesso file. Ad esempio, se si dispone del file A.PDF, creare un collegamento reale B.PDF allo stesso file, non importa se il file viene aperto con il nome A.PDF o B.PDF - è sempre lo stesso file, quindi se questo file viene semplicemente aperto, non è possibile eliminare nessuno dei due collegamenti.

Il vero motivo è che il nome è memorizzato come attributo nel record del file della tabella dei file master (nel caso di NTFS) e poiché il file è aperto, non è possibile eliminare nessuno dei due collegamenti (non è possibile modificare il file aperto).

In questo caso non c'è niente come il file originale, poiché entrambi i nomi appartengono allo stesso (e unico) file ed entrambi i nomi sono uguali. Il file viene effettivamente eliminato quando il conteggio dei collegamenti raggiunge lo zero.


Grazie per questa risposta a "Perché?" Come puoi vedere, ho aggiunto la mia risposta su "Come evitare?"
MarnixKlooster ReinstateMonica

4
Il "perché" è incompleto; se la cancellazione di un hardlink è una modifica, quindi anche l'aggiunta di uno, ma è possibile aggiungere hardlink per aprire i file, semplicemente non eliminarli o rinominarli. Penso che il "perché" sia solo che è stato deciso che i collegamenti fisici non possono essere rinominati o eliminati mentre un file è aperto; una decisione di progettazione intenzionale.
Roman,


1

Come dettagliato nella risposta di Robert Goldwein , un collegamento così difficile non può essere eliminato mentre il file è in uso. Tuttavia, risulta possibile una cancellazione ritardata.

Il commento di Damon su questa domanda suggerisce di usare il file di spostamento dalla Suite Sysinternals.

Nel mio caso, dove voglio farlo da PowerShell, posso usare Lee Holmes per fare in modo che Windows elimini il file al prossimo avvio.Move-LockedFilelink.mp3 $null

Entrambi i precedenti utilizzano la funzione MoveFileEx Win32 con il flag MOVEFILE_DELAY_UNTIL_REBOOT .

Aggiornamento: vedi https://gist.github.com/marnix/7565364 per un documento Remove-File-Eventuallyche ho appena modificato. Nessuna garanzia :-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.