¿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?

MarnixKlooster ReinstateMonica
fuente
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.

Robert Goldwein
fuente
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
2

Use la herramienta FSUTIL para mantener los enlaces simbólicos de forma segura.

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

fsutil reparsepoint delete link.mp3

eliminaría el enlace duro mientras se conserva orig.mp3

Stavr00
fuente
2
¿Pero funcionaría esto en enlaces duros? No lo creo
Daniel B
Bueno ... tengo esto. Error: The process cannot access the file because it is being used by another process.
ST3
fallar. igual que @ ST3.
Señor CMasMas
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 :-)

MarnixKlooster ReinstateMonica
fuente