Si el código ejecutado en un archivo debe estar bloqueado o no, es una decisión de diseño y MS simplemente decidió bloquearlo, porque tiene claras ventajas en la práctica: así no necesita saber qué código en qué versión se utiliza por cual aplicación Este es un problema importante con el comportamiento predeterminado de Linux, que simplemente es ignorado por la mayoría de las personas. Si se reemplazan las bibliotecas de todo el sistema, no se puede saber fácilmente qué aplicaciones usan el código de dichas bibliotecas, la mayoría de las veces lo mejor que se puede obtener es que el administrador de paquetes conoce algunos usuarios de esas bibliotecas y las reinicia. Pero eso solo funciona para cosas generales y bien conocidas como tal vez Postgres y sus libs o tal. Los escenarios más interesantes son si desarrolla su propia aplicación contra algunas librerías de terceros y esas son reemplazadas, porque la mayoría de las veces el administrador de paquetes simplemente no conoce su aplicación. Y eso no es solo un problema de código C nativo o similar, puede ocurrir con casi todo: simplemente use httpd con mod_perl y algunas bibliotecas Perl instaladas usando un administrador de paquetes y deje que el administrador de paquetes actualice esas bibliotecas Perl por cualquier motivo. No reiniciará su httpd, simplemente porque no conoce las dependencias. Hay muchos ejemplos como este, simplemente porque cualquier archivo puede contener código en uso en la memoria en cualquier tiempo de ejecución, piense en Java, Python y todas esas cosas.
Así que hay una buena razón para tener la opinión de que bloquear archivos por defecto puede ser una buena opción. Sin embargo, no necesitas estar de acuerdo con esas razones.
Entonces, ¿qué hizo MS? Simplemente crearon una API que le da a la aplicación que realiza la llamada la oportunidad de decidir si los archivos deben estar bloqueados o no, pero decidieron que el valor predeterminado de esta API es proporcionar un bloqueo exclusivo a la primera aplicación de llamada. Eche un vistazo a la API alrededor de CreateFile y su argumento dwShareMode
. Esa es la razón por la que es posible que no pueda eliminar archivos en uso por alguna aplicación, simplemente no le importa su caso de uso, utilizó los valores predeterminados y, por lo tanto, Windows obtuvo un bloqueo exclusivo para un archivo.
No crea en las personas que le dicen algo acerca de que Windows no utiliza el recuento de referencias en HANDLEs o no admite Hardlinks o tal, eso es completamente incorrecto. Casi todas las API que usan HANDLEs documentan su comportamiento con respecto al conteo de ref y usted puede leer fácilmente en casi cualquier artículo sobre NTFS que de hecho soporta Hardlinks y siempre lo hizo, ya que Windows Vista también tiene soporte para Symlinks y el soporte para Hardlinks ha sido mejorado al proporcionar API a read all hard links for a given file y tal.
Además, es posible que simplemente quiera echar un vistazo a las estructuras utilizadas para describir un archivo, p. Ext4 en comparación con los de NTFS, que tienen mucho en común. Ambos funcionan con el concepto de extensiones, que separa los datos de atributos como el nombre de archivo, y los inodos son simplemente un nombre más para un concepto anterior, pero similar. Incluso Wikipedia enumera ambos sistemas de archivos en su article.
Hay mucho FUD alrededor del bloqueo de archivos en Windows en comparación con otros sistemas operativos en la red, al igual que sobre la desfragmentación. ;-) Parte de este FUD se puede descartar simplemente leyendo un poco en el Wikipedia.
Hay una utilidad llamada [WhoLockMe] (http://www.dr-hoiby.com/WhoLockMe/index.php) que agrega una entrada de menú al menú contextual en el explorador que puede mostrar el proceso (es) bloqueando un archivo dado. Extremadamente útil cuando obtienes errores de bloqueo de archivos extraños. Editar: Sé que esto no responde a la pregunta, pero pensé que era lo suficientemente útil en el contexto para justificar una respuesta por separado (como opuesto a un simple comentario). – JesperE