Linux elimina un archivo de manera completamente diferente a como lo hace Windows. Primero, una breve explicación sobre cómo se gestionan los archivos en los sistemas de archivos nativos * unix.
El archivo se mantiene en el disco en la estructura multinivel llamada i-node
. Cada nodo i tiene un número único en el sistema de archivos único. La estructura i-node mantiene información diferente sobre un archivo, como su tamaño, bloques de datos asignados para el archivo, etc., pero en aras de esta respuesta, el elemento de datos más importante es a link counter
. El directories
son los archivos que mantienen registros sobre los archivos. Cada registro tiene el número de i-nodo al que hace referencia, la longitud del nombre del archivo y el nombre del archivo en sí. Este esquema permite tener 'punteros', es decir, 'enlaces' al mismo archivo en diferentes lugares con diferentes nombres. El contador de enlaces del i-node en realidad mantiene el número de enlaces que se refieren a este i-node.
¿Qué sucede cuando algún proceso abre el archivo? Primero, la open()
función busca el registro del archivo. Luego verifica si la estructura de i-nodo en memoria para este i-nodo ya existe. Esto puede suceder si alguna aplicación ya tenía este archivo abierto. De lo contrario, el sistema inicializa una nueva estructura de i-nodo en memoria. Luego, el sistema aumenta el contador abierto de la estructura i-node en memoria y devuelve a la aplicación su descriptor de archivo.
Se llama a la llamada a la biblioteca de Linux para eliminar un archivo unlink
. Esta función elimina el registro del archivo de un directorio y disminuye el contador de enlaces del nodo i. Si el sistema descubrió que existe una estructura de i-nodo en memoria y su contador abierto no es cero, entonces esta llamada devuelve el control a la aplicación. De lo contrario, comprueba si el contador de enlaces se convirtió en cero y, si lo hace, el sistema libera todos los bloques asignados para el i-node y el i-node en sí y vuelve a la aplicación.
¿Qué sucede que una aplicación cierra un archivo? La función close()
disminuye el contador abierto y verifica su valor. Si el valor no es cero, la función vuelve a la aplicación. De lo contrario, comprueba si el contador de enlace del i-nodo es cero. Si es cero, libera todos los bloques del archivo y el nodo i antes de volver a la aplicación.
Este mecanismo le permite "eliminar" un archivo mientras está abierto. Al mismo tiempo, la aplicación que abrió un archivo todavía tiene acceso a los datos del archivo. Entonces, JRE, en su ejemplo, todavía mantiene su versión de archivo abierta mientras hay otra versión actualizada en el disco.
Además, esta función le permite actualizar glibc (libc), la biblioteca central de todas las aplicaciones, en su sistema sin interrumpir su funcionamiento normal.
Ventanas
Hace 20 años no conocíamos ningún otro sistema de archivos que FAT en DOS. Este sistema de archivos tiene una estructura y principios de gestión diferentes. Estos principios no le permiten eliminar un archivo cuando se abre, por lo que el DOS y, últimamente, Windows deben denegar cualquier solicitud de eliminación en un archivo que esté abierto. Probablemente NTFS permitiría el mismo comportamiento que los sistemas de archivos * nix, pero Microsoft decidió mantener el comportamiento habitual de la eliminación de archivos.
Esta es la respuesta. No es corto, pero ahora tienes la idea.
Editar : Una buena lectura sobre las fuentes de Win32
desorden: https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Créditos a @Jon
ren MonsterB.jar MonsterB.ja_
, debería funcionar. Funciona para archivos dll y exe definitivamente.fopen
comando Biblioteca C llamaCreateFile
con elFILE_SHARE_DELETE
indicador, por lo que no lo permite para la mayoría de los programas que abren archivos.