2009-09-23 38 views
10

Necesito crear algunos mapas de bits y guardarlos en el sistema de archivos. Por alguna razón, el sistema MScharting quiere que los suministros de los archivos de fondo sean rutas en forma de cadena.Archivos temporales en .Net

Estoy creando dinámicamente la imagen de fondo, aunque solo unas pocas veces.

¿Cuál es la mejor manera de crear estos archivos y luego limpiarlos?

+0

¿Estás seguro de que los métodos que estás llamando no tienen sobrecargas que toman transmisiones en lugar de rutas? – MusiGenesis

+0

Sé que hay un montón de bibliotecas de MS que solo aceptan rutas (a DirectX se me ocurre). En general, se considera un diseño de API deficiente, pero a veces no tiene muchas opciones, salvo la configuración de un disco RAM. –

Respuesta

9

Su mejor opción es tener un Administrador de archivos temporales que implemente IDisponible; le pides archivos temporales, que se genera automáticamente y se almacena en un directorio temporal en algún lugar, luego todos se borran cuando TemporaryFileManager es eliminado, ya sea por ti o por el finalizador (si has implementado el patrón desechable correctamente)

14

Así es como se puede obtener la ruta completa y el nombre de archivo de un archivo temporal:

string tempFile = System.IO.Path.GetTempFileName(); 

Crear el archivo con el nombre de archivo & este camino y cuando haya terminado eliminarlo.

+0

Por razones desconocidas, este método en algún momento no es confiable y puede arrojar System.IO.IOException: El archivo está disponible –

1

En mis proyectos, tengo una clase de ayuda llamada TempFile. Tiene varios métodos estáticos que utilizo para escribir una secuencia (o una matriz de bytes si es necesario) en un archivo temporal. Aquí está un ejemplo simplificado de un procedimiento de este tipo:

public static string Write(Stream stream) 
{ 
    string FileName = Path.GetTempFileName(); 

    // Write the contents of stream to a file with FileName 

    return FileName; 
} 

Entonces, tengo otro método que acepta una ruta de archivo para su posterior eliminación, que es un miembro de mi clase 'análisis', si bien se puede poner en su propia estática clase de ayuda:

public string ForDeletion(string path) 
{ 
    ListOfPaths.Add(path); 

    return path; 
} 

por último, hago lo siguiente:

SomeApiFunction(ForDeletion(TempFile.Write(myStream))); 

Esta es la mejor manera que he llegado con para eludir la falta de capacidad de manejo de corriente de un API.

0

que utilizan esta solución:

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