¿Por qué no puedo cambiar el nombre de un archivo que se está leyendo en Windows como puedo hacerlo en Linux / Mac?

23

Una de las cosas que me ha intrigado desde que comencé a usar Linux es el hecho de que le permite cambiar el nombre de un archivo o incluso eliminarlo mientras se está leyendo. Un ejemplo es cómo accidentalmente intenté eliminar un video mientras se estaba reproduciendo. Tuve éxito y me sorprendí al saber que puedes cambiar casi cualquier cosa en un archivo sin importar si se está utilizando en este momento o no.

the_midget_17
fuente
2
Cambiar el nombre de un archivo bloqueado no es un problema en Windows. Por lo general, eliminar es que hay pocos programas que abren un archivo con la opción FILE_SHARE_DELETE activada.
Hans Passant
En realidad no lo eliminó, simplemente lo desvinculó del directorio en el que estaba. El archivo aún existe, es posible que no tenga ningún nombre en el sistema de archivos. (Aunque todavía tiene un nombre en el /procsistema de archivos a través del programa que lo tiene abierto). Un archivo solo se puede eliminar realmente si no le quedan referencias, y esto sucede automáticamente.
David Schwartz

Respuestas:

36

Cada vez que abre o ejecuta un archivo en Windows, Windows bloquea el archivo en su lugar (esto es una simplificación, pero generalmente es cierto). Un archivo que está bloqueado por un proceso no se puede eliminar hasta que ese proceso lo libere. Es por eso que cada vez que Windows tiene que actualizarse necesita un reinicio para que surta efecto.

Por otro lado, los sistemas operativos tipo Unix como Linux y Mac OS X no bloquean el archivo sino los sectores de disco subyacentes. Esto puede parecer una diferenciación trivial, pero significa que el registro del archivo en la tabla de contenido del sistema de archivos se puede eliminar sin perturbar ningún programa que ya tenga el archivo abierto. Por lo tanto, puede eliminar un archivo mientras aún se está ejecutando o de otro modo en uso y continuará existiendo en el disco siempre que algún proceso tenga un identificador abierto aunque su entrada en la tabla de archivos haya desaparecido.

Andrew Lambert
fuente
2
Gracias por esta respuesta Me explica la diferencia mucho más. También ayuda a explicar por qué cargar archivos / videos de gran tamaño no ocupa una gran cantidad de RAM. De lo contrario, reproducir un video grande podría atascar todo el sistema.
Jerry Saravia
44
Si eliminó un archivo que estaba en uso y desea recuperarlo en Linux, puede encontrar la entrada del archivo en / proc, como se describe en esta pregunta .
Ken Bloom
2
Esto es una especie de generalización: no todas las actualizaciones de Windows en estos días (en Windows 7) requieren un reinicio, y he hecho mucho en Linux que sí.
Alan B
10

Windows por defecto es el bloqueo automático y obligatorio de archivos. UNIX establece de forma predeterminada el bloqueo manual y cooperativo de archivos. En ambos casos, los valores predeterminados pueden ser anulados, pero en ambos casos generalmente no lo son.

Una gran cantidad de código antiguo de Windows utiliza la API C / C ++ (funciones similares fopen) en lugar de la API nativa (funciones similares CreateFile). La API de C / C ++ no le da forma de especificar cómo funcionará el bloqueo obligatorio, por lo que obtiene los valores predeterminados. El "modo compartido" predeterminado tiende a prohibir operaciones "en conflicto". Si abre un archivo para escribir, se supone que las escrituras entran en conflicto, incluso si nunca escribe realmente en el archivo. Lo mismo ocurre con los cambios de nombre.

Y, aquí es donde empeora. Además de abrir para lectura o escritura, la API de C / C ++ no proporciona ninguna forma de especificar qué piensa hacer con el archivo. Por lo tanto, la API debe asumir que va a realizar cualquier operación legal. Dado que el bloqueo es obligatorio, se rechazará el openque permite una operación en conflicto, incluso si el código nunca tuvo la intención de realizar la operación en conflicto, sino que simplemente estaba abriendo el archivo para otro propósito.

Entonces, si el código usa la API C / C ++, o usa la API nativa sin pensar específicamente en estos problemas, terminarán impidiendo el conjunto máximo de operaciones posibles para cada archivo que abran y no podrán abrir un archivo a menos que cada operación posible podría funcionar en él una vez abierto no está en conflicto.

En mi opinión, el método de Windows funcionaría mucho mejor que el método de UNIX si cada programa eligiera sus modos de compartir y los modos abiertos sabiamente y manejara de manera sensata los casos de falla. Sin embargo, el método UNIX funciona mejor si el código no se molesta en pensar en estos problemas. Desafortunadamente, la API básica de C / C ++ no se correlaciona bien con la API de archivos de Windows de una manera que maneja los modos de compartir y los conflictos se abren bien. Entonces el resultado neto es un poco desordenado.

David Schwartz
fuente
0

Esta es una pregunta muy interesante y me ha hecho pensar en una respuesta viable. Espero que otros puedan proporcionar respaldo aquí.

Utilizo Windows y Linux y noté esto también. También soy un usuario de vim. Vim leerá un archivo de texto en un "búfer", o la RAM, y luego no tocará el archivo real hasta que lo guarde. Linux podría estar realizando este tipo de acción en general con todos los archivos.

Tome su video, por ejemplo, lee el video, todo si es posible, en la RAM, y luego tiene una copia del video que es fácilmente accesible, buscable, saltable. Si el archivo es demasiado grande, es posible que experimente problemas porque Linux podría no leer todo el video, tal vez solo una gran parte. Cuando su reproductor llegue al final del video almacenado, intentará leer el archivo nuevamente. Si ha eliminado el video, eso es una mierda para usted.

Windows es un sistema operativo mucho más "seguro" en algunos casos porque no le permitirá hacerlo. Puede almacenar en búfer los archivos de la misma manera que Linux, pero también agrega bloqueo de archivos para evitar que usted u otros programas alteren los archivos en los que está trabajando o viendo. Esto ayuda a mantener el archivo intacto y evita que usted u otros programas sobrescriban los cambios de cada uno.

Jerry Saravia
fuente
En realidad no puedes eliminarlo . Solo muévelo y renómbralo.
Daniel Beck
2
Puedes 'rm'. Eso está lo suficientemente cerca como para eliminarlo.
Chris Moore