Pregunta

El lenguaje utilizado: C #

Teoría: Quiero crear un archivo con el FileOptions.DeleteOnClose bandera en una carpeta temporal. El archivo se crea correctamente y escribo dato sobre él, el siguiente paso es poner en marcha la aplicación asociada con el Process.Start(...) archivo y permitir al usuario inspeccionar el documento, por último cierro mi mango y tan pronto como otro proceso de cerrar la manija a la archivo temporal, el archivo se elimina por el sistema operativo.

Mi problema es que otros procesos no pueden abrir el archivo, incluso para la lectura, a pesar de si añado FileShare.ReadWrite | FileShare.Delete al modo de uso compartido.

¿Alguna sugerencia?

¿Fue útil?

Solución

Los otros procesos necesitan especificar FileShare.Delete cuando abran el archivo DeleteOnClose

Desde el documentos MSDN CreateFile :

  

"FILE_FLAG_DELETE_ON_CLOSE ... solicitudes subsiguientes para abrir el archivo fallan, a menos que se especifique el modo compartido FILE_SHARE_DELETE."

Otros consejos

Comprobar lo siguiente:

Es necesario asegurarse de que todos los procesos están abriendo el archivo con FileShare.ReadWrite y FileShare.Delete.

Incluso si el creador se abre con una cuota-lectura-escritura, si un segundo programa intenta abrir con una cuota de lectura, el segundo programa es básicamente diciendo que nadie más puede escribir. Pero el primer programa ya tiene ese poder lo que la segunda apertura falla.

Cambiar a Linux SCNR

Ok, ahora en serio: Esto es un defecto en el sistema operativo Windows, que en realidad no puede ser trabajado alrededor. Cada programa de abrir el archivo debe ponerse de acuerdo sobre otros programas que tienen el archivo abierto en el mismo tiempo. Eso era un problema que tengo muchos años atrás, cuando todavía he usado Windows también. No es suficiente para abrir un archivo y decir: dejar que nadie más abrir esta también. Los demás también deben decir abrir este archivo, incluso si está abierto ya.

En Linux, por el contrario, el sistema operativo no permite que ningún archivo de bloqueo en la forma en que Windows lo hace en absoluto. Aquí, si cualquier archivo es utilizado por más de un programa al mismo tiempo, los programas por sí misma debe asegurarse de que los accesos concurrentes te la bloquean. Además, en Linux, podemos simplemente crear el archivo, asegúrese de que el otro proceso se ha iniciado y abrimos el archivo y luego simplemente borrar el archivo (mientras está abierto). El nombre del archivo se retira del sistema de archivos immediatelly, pero el archivo todavía es mantenido por el controlador de sistema de archivos hasta que el último eslabón (incluidos los identificadores de archivo abiertos) se llevó eliminado.

Volver a su problema: Como todo esto doen't trabajo en Windows, que podría hacer otros dos enfoques:

  1. Registrar el archivo que desea borrar en el próximo arranque (en los días Win3x, había una sección en el win.ini para eso. Reciente versión de Windows todavía admite que, simplemente no puedo recordar por más tiempo, como se hace ahora ).
  2. Iniciar el otro proceso, esperar a que se abra el archivo, cierre el archivo y vuelva a intentar cada minuto para eliminar el archivo hasta su eliminación tiene éxito ...

Saludos, Bodo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top