2010-07-08 6 views
9

Descargo de responsabilidad: soy principalmente un desarrollador de Linux/web.¿Alguna vez podremos eliminar un archivo abierto en Windows?

Windows tiene esta característica "agradable" en la que niega el permiso para eliminar cualquier archivo que se mantenga abierto por cualquier proceso. Por lo tanto, si un antivirus ingresa el archivo incorrecto en el momento equivocado, es posible que algún programa aleatorio se comporte mal y posiblemente se bloquee.

¿Estoy en lo cierto? ¿Hay planes para arreglar esto?

¿Alguno de ustedes lo considera aceptable, o, ¿cómo podría parecer una buena idea en ese momento?

Editar:

Funciona de manera muy diferente en Unix, y lo ha sido durante décadas.

A modo de ejemplo:

  • proceso 1 se abre foo.txt, para leer o escribir, o ambos, no importa
  • proceso 2 borra el archivo
  • el archivo se desvincula de la sistema de archivos
  • proceso 1 sigue leyendo y/o escribiendo, el archivo aún existe, y puede crecer mientras haya espacio en el disco. Simplemente no es accesible desde otros procesos que aún no tienen un control de archivo.
  • cuando el proceso 1 se cierra el archivo, no será accesible desde cualquier lugar

En realidad, un patrón de uso común para los archivos temporales en Unix es:-remove-leer de apertura/cierre y escritura.

+1

En lugar de eliminar un archivo que otro proceso utiliza sin advertencia, lo que definitivamente no hará que el programa se comporte mal y posiblemente falle. Hay programas como unlocker que te permiten cerrar manejadores de archivos, pero no veo cómo es una buena idea eliminar un archivo que está en uso. – IVlad

+0

Pero, si alguien borra un archivo que está utilizando el proceso 1, ¿cómo podría el proceso 1 portarse mal o bloquearse?El archivo todavía está allí, puede leerse o escribirse, simplemente no está disponible si no tiene un identificador de archivo ya abierto. –

+1

Es solo una de las muchas decisiones filosóficas donde las dos plataformas difieren. Ambos métodos tienen sus pros y sus contras, aunque personalmente no encuentro que ninguno de los métodos sea en general mejor o peor que el otro. Cuando se desarrolla para una plataforma, debe conocer sus idiosincrasias y manejarlas de manera adecuada. Si no puede hacer esto y su programa se bloquea, entonces su programa tiene la culpa, no la plataforma. – Luke

Respuesta

5

Su declaración inicial no es correcta. Windows permite borrar archivos abiertos. Solo tiene que especificar FILE_SHARE_DELETE y ya está todo listo. Los programadores cuidadosos deberían decidir con sensatez si esa bandera (o compartir para leer/escribir) tiene sentido y aprobarla.

Un producto antivirus que no abre archivos con el uso compartido completo (incluida la eliminación) habilitado tiene errores.

Windows, sin embargo, recuerda el directorio de trabajo actual de cualquier proceso y evita que se elimine. Este directorio de trabajo es independiente de la ubicación de los archivos abiertos por el proceso.

+0

Si se entiende como una disculpa de lo que Windows hace, creo que es defectuoso. Cualquier programa puede romper cualquier otro programa, sin que sea necesario. Un administrador de archivos recién abierto en un directorio rompe el instalador que está tratando de eliminar y volver a crear ese mismo directorio. – eudoxos

+0

@eudoxos: ¿Quiere decir cómo Windows evita el borrado de directorios para todos los directorios de trabajo actuales? ¿Has leído http://blogs.msdn.com/b/oldnewthing/archive/2010/11/09/10087919.aspx? Personalmente, esto también me molesta, pero parece que no hay una solución técnica para esto. – mafu

+0

@eudoxos: En cuanto al "abrir en el administrador de archivos", parece que ese no es el caso. Al menos Windows Explorer no impide que se elimine su carpeta que se muestra actualmente. – mafu

0

Esto es perfectamente aceptable. Imagine una situación en la que está leyendo un archivo de base de datos en su aplicación, y aparece otra aplicación que borra el archivo de la base de datos debajo de usted. ¿Cómo sabe su aplicación para verificar que el archivo aún exista? ¿Cómo se asegurará de que la secuencia de archivos no intente de repente leer ese archivo en un milisegundo, pero no en el siguiente? Esta es la razón por la que los programas pueden bloquear archivos, para garantizar que el archivo siempre estará allí hasta que el programa determine que ya se ha terminado.

Puede ser más útil para decirnos por qué este bloqueo de archivos no es deseable en su caso. Estoy bastante seguro de que los programas antivirus hacen un bloqueo optimista en los archivos, a menos que los esté limpiando.

+1

Es como sacar los cimientos de debajo de una casa. –

+0

editado para mayor claridad –

+0

Cada operación de E/S de archivos puede indicar un error, por lo tanto, a menos que haya sido descuidado al comprobarlos, no se realizarán comprobaciones adicionales. –

Cuestiones relacionadas