¿Cómo eliminar el enlace duro de Windows NTFS (mklink / h) mientras el original está en uso?


10

En un sistema de archivos Windows NTFS, tengo un archivo (por ejemplo, orig.mp3). Abro este archivo, a través de esta ruta orig.mp3, de tal manera que esté en uso (digamos, reproduciéndolo en VLC).

Luego creo un enlace duro ( cmd /c mklink /h link.mp3 orig.mp3). Esto da como resultado dos rutas NTFS que apuntan exactamente al mismo archivo.

Finalmente trato de eliminar el archivo vinculado nuevamente ( del link.mp3o eliminarlo en el Explorador de Windows).

Esto falla con un error: "El proceso no puede acceder al archivo porque otro proceso lo está utilizando".

¿Por qué? Y lo más importante: ¿cómo puedo evitar esto (además de asegurarme de que ningún proceso tenga el archivo original en uso)? ¿Puedo decirle a Windows que haga una 'eliminación retardada' para que el archivo vinculado se elimine automáticamente cuando el original ya no esté en uso?


2
Probablemente debería preguntarse en superusuario. Pero aún así: movefile debería ser capaz de hacer el truco en cualquier caso. Sin embargo, es sorprendente que no pueda simplemente eliminar el enlace duro, en realidad debería ser un archivo completamente "no relacionado".
Damon

Respuestas:


11

Este es un comportamiento bastante esperado, el enlace duro es solo otro nombre para el mismo archivo. Por ejemplo, si tiene el archivo A.PDF, cree el enlace rígido B.PDF al mismo archivo, no importa si el archivo se abre con el nombre A.PDF o B.PDF; sigue siendo el mismo archivo, así que si este archivo simplemente se abre, no puede eliminar ninguno de los enlaces.

La razón real es que el nombre se almacena como un atributo en el registro de archivo de la tabla del archivo maestro (en el caso de NTFS) y, dado que el archivo está abierto, no puede eliminar ninguno de los enlaces (no puede modificar el archivo abierto).

En este caso no hay nada como el archivo original, ya que ambos nombres pertenecen al mismo archivo (y al único) y ambos nombres son iguales. El archivo se elimina realmente cuando el recuento de enlaces llega a cero.


Gracias por esta respuesta a "¿Por qué?" Como puede ver, agregué mi propia respuesta sobre "¿Cómo evitarlo?"
MarnixKlooster ReinstateMonica

44
El "por qué" está incompleto; si eliminar un enlace rígido es una modificación, también lo es agregar uno, pero puede agregar enlaces rígidos para abrir archivos, simplemente no eliminarlos o cambiarles el nombre. Creo que el "por qué" es simplemente que se decidió que los enlaces duros no se pueden renombrar o eliminar mientras un archivo está abierto; Una decisión de diseño intencional.
RomanSt


1

Como se detalla en la respuesta de Robert Goldwein , dicho enlace duro no se puede eliminar mientras el archivo está en uso. Sin embargo, resulta posible una eliminación retrasada.

El comentario de Damon sobre esta pregunta sugiere usar movefile de la Suite Sysinternals.

En mi caso, donde quiero hacer esto desde PowerShell, puedo usar Lee Holmes para que Windows elimine el archivo en el próximo arranque.Move-LockedFilelink.mp3 $null

Los dos anteriores utilizan la función Win32 MoveFileEx con el indicador MOVEFILE_DELAY_UNTIL_REBOOT .

Actualización: consulte https://gist.github.com/marnix/7565364 para obtener información Remove-File-Eventuallyque acabo de piratear. Sin garantías :-)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.