2009-03-18 25 views
13

Necesito trabajar con algunos archivos temporales en mi aplicación Windows Forms .NET 3.5. Esos archivos se abren en una aplicación externa que, por supuesto, puede estar ejecutándose durante más tiempo que mi propio programa.Eliminación de archivos temporales después del uso

¿Existen algunas prácticas recomendadas para garantizar que estos archivos temporales se limpien en cualquier momento para evitar llenar el disco duro del usuario con archivos "basura" que ya no se necesitan? ¿O incluso Windows maneja esto automáticamente?

Un buen ejemplo es cualquier cliente de correo: cuando abre un archivo adjunto en cualquier aplicación, por lo general se escribe en un archivo temporal que se abre. ¿Hay alguna manera de descubrir cómo esos archivos gestionan la limpieza?

El uso de Google me ha mostrado muchas, muchas herramientas de limpieza y puesta a punto para limpiar el directorio temporal a mano, pero no me gustaría obligar a los usuarios a hacerlo. :-)

Se agradece cualquier ayuda.

Matthias

Respuesta

5

Si intenta borrar de forma determinista el contenido de una carpeta de archivos temporales de tipo, se arriesga a eliminar los archivos que están en uso por otros procesos. El sistema operativo de Windows proporciona herramientas para permitir a los usuarios eliminar esos archivos cuando el espacio de disco disponible del volumen alcanza un cierto umbral.

Ahora, si puede determinar que después de usar un archivo temporal específico que ya no será necesario, entonces no hay inconveniente en eliminar ese archivo específico.

+0

Sí, estoy captando el evento de salida del proceso para eliminar archivos que ya no se necesitan con certeza ... entonces, ¿es una buena práctica "alentar" al usuario a usar la herramienta de limpieza de disco de Windows? :) –

27

En .NET puede usar la clase TempFileCollection para administrar un conjunto de archivos temporales que su aplicación debe limpiar (tenga en cuenta que está bastante oculto en el espacio de nombres CodeDom). Obviamente, no puede eliminar ningún archivo que no sea de su propiedad, ya que los archivos aún pueden ser abiertos por otra aplicación (y eliminarlos puede causar problemas graves).

+0

Clase TempFileCollection? ¡Caliente! –

+8

De hecho ;-) No sé por qué esta clase está tan bien escondida. Si no fuera por accidente no lo encontraría ... –

+0

Guau, no hay más soluciones laminadas a mano, parece que Microsoft implementa todo 2 años después de que lo necesitamos;) – invert

1

Creo que se eliminarán cuando el usuario cierre la sesión.

En los días en que las personas apagaban sus computadoras todos los días, esa era probablemente la solución perfecta.

Ahora, las personas pueden pasar meses sin desconectarse, por lo que puede no ser una buena idea confiar en eso.

Además, si apagan la máquina sin apagarla, tampoco se eliminarán los archivos.

Puede utilizar un observador del sistema de archivos que mira el archivo que escribe, y esperar un período de inactividad (10 minutos, 1 hora, 1 día o lo que sea) y luego eliminar el archivo.

Eso no funcionará para todo. Algunos programas pueden tener un archivo "abierto", pero es posible que no tengan el archivo subyacente bloqueado. Si eso sucede, entonces no tendrías forma de saber cuándo es seguro eliminar el archivo.

Sin embargo, estoy pensando que probablemente puedas simplemente ignorar el problema. La mayoría de las personas probablemente tengan un excedente de espacio en el disco duro de todos modos, por lo que probablemente no puedan toparse con él. Si lo hacen, creo que Windows muestra un cuadro de diálogo de espacio en disco bajo que les da la opción de borrar su directorio temporal, lo que resolvería el problema.

Actualización:

Creo actualización de Windows se reiniciará el ordenador del usuario una vez al mes, por lo que los archivos temporales deben borrarse cuando esto sucede.

No hay garantía de que no haya problemas, pero en la práctica creo que debería ser bastante raro.

Actualización 2:

Impulsada por un comentario, fui y, de hecho probado esto, y parece que las ventanas no se eliminan los archivos temporales cuando el usuario cierra la sesión. Sin embargo, todavía digo que en el caso del OP, este no es un problema real. Cuando se convierte en un problema (debido a que el espacio en disco es bajo), Windows solicitará al usuario que elimine los archivos temporales.

+0

¿Desea confiar en que haya una actualización de Windows? ¿Y que la actualización requerirá un reinicio? ¿Y que el usuario no ha deshabilitado la ejecución automática de actualizaciones? – Martin

+0

Estoy diciendo que no es un gran problema si deja cosas en la carpeta temporal. Hay varias maneras en que Windows eliminará automáticamente los archivos. Incluso si no es solo un problema si el espacio en el disco es bajo. Cuando eso sucede, el usuario ve un cuadro de diálogo que dice "así es cómo solucionar esto". –

+0

En una configuración predeterminada, Windows no limpiará ningún archivo de su carpeta temporal (a menos que ejecute Cleanmgr.exe cuando reciba el aviso de que su disco no tiene suficiente espacio libre en el disco, pero no lo llamaría automático) . –

6

La responsabilidad de limpiar los archivos temporales debe estar en la aplicación que los creó. Es muy fácil. Yo uso una clase que se ve algo como esto:

public class TempFile : IDisposable 
{ 
    public TempFile() 
    { this.path = System.IO.Path.GetTempFileName(); } 

    public void Dispose() 
    { File.Delete(path); } 

    private string path; 
    public string Path { get { return path; } } 
} 

Si usted está obligado a limpiar los archivos temporales de otra aplicación que necesita algún medio de comunicación con la suya. Como mínimo, debería ser capaz de proporcionar un semáforo. Sin embargo, la complejidad de hacer esto es mayor que la complejidad de simplemente hacer que la aplicación de origen se encargue de sus propios archivos.

2

Tenemos un problema de duración de archivo similar: la aplicación (winforms) puede obtener un documento de un almacén de repositorio central para que el usuario lo vea, pero el usuario debe poder cerrar nuestra aplicación sin que afecte el archivo que están viendo . Debido a problemas de seguridad, los archivos del documento deben limpiarse para que no queden por mucho tiempo.

La solución que utilizamos es crear una carpeta con un nombre derivado de la fecha en el área de almacenamiento aislada de los usuarios y usarla como la memoria caché actual. En el cierre y la puesta en marcha de la aplicación, verificamos las carpetas de caché con fecha anterior y las eliminamos (y su contenido).

1

Al usar archivos temporales en ASP.NET, use el evento PAGE_DISPOSED para eliminar cualquier archivo temporal que haya creado en la página. De lo contrario, puede terminar conteniendo componentes que no se sueltan hasta que se DESECHEN.

0
  • puede crear un archivo temporal, en la que se puede seguir escribiendo los nombres de los archivos creados durante el proceso, al final del procesamiento puede ser que usted puede (precondición - Implementar IDisposable e) eliminar en el método Disponse después la operación esta completa

  • Otra forma es el proceso de escritura independiente que realiza la limpieza en cada intervalo.

  • Agregue la fecha al final del archivo y elimine al final del día esa fecha, y el proceso generará nuevos archivos con una nueva fecha al final.

  • una buena sugerencia dada por divo tempfilecollection class.

Espero que ayude.

1

que utilizan esta solución (muy fiable):

using System.IO; 
using System.Reflection; 

namespace Konard.Helpers 
{ 
    public static partial class TemporaryFiles 
    { 
     private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt"; 
     static private readonly object UsedFilesListLock = new object(); 

     private static string GetUsedFilesListFilename() 
     { 
      return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix; 
     } 

     private static void AddToUsedFilesList(string filename) 
     { 
      lock (UsedFilesListLock) 
      { 
       using (var writer = File.AppendText(GetUsedFilesListFilename())) 
        writer.WriteLine(filename); 
      } 
     } 

     public static string UseNew() 
     { 
      var filename = Path.GetTempFileName(); 
      AddToUsedFilesList(filename); 
      return filename; 
     } 

     public static void DeleteAllPreviouslyUsed() 
     { 
      lock (UsedFilesListLock) 
      { 
       var usedFilesListFilename = GetUsedFilesListFilename(); 

       if (!File.Exists(usedFilesListFilename)) 
        return; 

       using (var listFile = File.Open(usedFilesListFilename, FileMode.Open)) 
       { 
        using (var reader = new StreamReader(listFile)) 
        { 
         string tempFileToDelete; 
         while ((tempFileToDelete = reader.ReadLine()) != null) 
         { 
          if (File.Exists(tempFileToDelete)) 
           File.Delete(tempFileToDelete); 
         } 
        } 
       } 

       // Clean up 
       using (File.Open(usedFilesListFilename, FileMode.Truncate)) { } 
      } 
     } 
    } 
} 

Cada vez que necesite el uso de archivos temporales:

var tempFile = TemporaryFiles.UseNew(); 

para estar seguro de todos los archivos temporales se eliminan después de la aplicación se cierra o se bloquea puso

TemporaryFiles.DeleteAllPreviouslyUsed(); 

al inicio de la aplicación.

Cuestiones relacionadas