create c# file filesystems temporary-files

c# - create - Eliminar en archivos cercanos



c# temp folder (4)

Quiero crear un archivo con el indicador FileOptions.DeleteOnClose en una carpeta temporal.

Cerré mi identificador y tan pronto como otro proceso cierra el identificador del archivo temporal, el sistema operativo elimina el archivo.

Por favor elabora. ¿Cómo es eliminado este archivo por el sistema operativo? Si quieres decir eliminarlo por código. ¿Por qué no guardar el filestream? Entonces puedes abrirlo con Process.Start

Lenguaje utilizado: C #

Teoría: Quiero crear un archivo con el indicador FileOptions.DeleteOnClose en una carpeta temporal. El archivo se creó con éxito y escribo dato en él, el siguiente paso es iniciar la aplicación asociada con el archivo Process.Start (...) y permitir que el usuario inspeccione el documento, finalmente cierro mi control y tan pronto como sea posible. otro proceso cierra el identificador del archivo temporal, el sistema operativo borra el archivo.

Mi problema es que otros procesos no pueden abrir el archivo, incluso para leer, a pesar de que agregue FileShare.ReadWrite | FileShare.Delete al modo de intercambio.

¿Alguna sugerencia?


Cambiar a Linux scnr

Bien, en serio ahora: ese es un defecto en el sistema operativo Windows que realmente no se puede solucionar. Cada programa que abre el archivo debe aceptar otros programas que tengan el archivo abierto al mismo tiempo. Ese fue un problema que tuve hace muchos años cuando aún usaba Windows también. No es suficiente abrir un archivo y decir: permita que alguien más abra esto también. Los demás también deben decir abrir este archivo incluso si ya está abierto.

En Linux, por el contrario, el sistema operativo no permite ningún bloqueo de archivos en la forma en que lo hace Windows. Aquí, si cualquier archivo es utilizado por más de un programa simultáneamente, los programas mismos deben asegurarse de que los accesos simultáneos se bloqueen. Además, en Linux, podemos simplemente crear el archivo, asegurarnos de que el otro proceso se haya iniciado y abrir el archivo y luego simplemente eliminar el archivo (mientras está abierto). El nombre del archivo se elimina inmediatamente del sistema de archivos, pero el archivo aún lo mantiene el controlador del sistema de archivos hasta que se eliminó el último enlace (incluidos los archivos abiertos).

De vuelta a su problema: como todo esto no funciona en Windows, podría hacer otros dos enfoques:

  1. Registre el archivo que se eliminará en el próximo inicio (en los días de Win3x, había una sección en win.ini para eso. La versión más nueva de Windows todavía lo admite, no puedo recordar más, cómo se hace ahora).
  2. Inicie el otro proceso, espere a que abra el archivo, cierre el archivo y luego intente cada minuto para eliminar el archivo hasta que la eliminación sea exitosa ...

Saludos, Bodo


Mira esto:

Debe asegurarse de que todos los procesos estén abriendo el archivo con FileShare.ReadWrite y FileShare.Delete.

Incluso si el creador se abre con share-readwrite, si un segundo programa intenta abrir con share-read, el segundo programa básicamente dice que nadie más puede escribir. Pero el primer programa ya tiene ese poder, por lo que el segundo abierto falla.


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

Desde los documentos CreateFile de MSDN :

" FILE_FLAG_DELETE_ON_CLOSE ... Las solicitudes abiertas subsiguientes para el archivo fallan, a menos que se especifique el modo de compartir FILE_SHARE_DELETE ".