2009-09-23 11 views
10

Ho bisogno di creare alcuni bitmap e salvarli nel file system. Per qualche ragione il sistema MScharting vuole che i suoi file di sfondo siano forniti come percorsi in forma di stringa.File temporanei in .Net

Sto creando dinamicamente l'immagine di sfondo, anche se solo poche volte.

Qual è il modo migliore per creare questi file e quindi eliminarli?

+0

Sei sicuro che i metodi che stai chiamando non abbiano sovraccarichi che eseguono flussi anziché percorsi? – MusiGenesis

+0

So che ci sono un sacco di librerie MS che accettano solo percorsi (DirectX è uno che viene in mente). Generalmente si considera una progettazione API scadente, ma a volte non si ha molta scelta, a meno di configurare un disco RAM. –

risposta

9

La soluzione migliore è disporre di un TemporaryFileManager che implementa IDisposable; lo chiedi per i file temporanei, che genera automaticamente e rimane in una directory temporanea da qualche parte, quindi vengono eliminati tutti quando il TemporaryFileManager viene eliminato, o dall'utente o dal finalizzatore (se hai implementato correttamente il modello monouso)

14

Ecco come è possibile ottenere il percorso completo e il nome file di un file temporaneo:

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

Creare il file utilizzando questo percorso nomefile & e quando hai finito eliminarlo.

+0

Per ragioni sconosciute questo metodo a volte non è affidabile e può generare System.IO.IOException: il file è disponibile –

1

Nei miei progetti, ho una classe helper chiamata TempFile. Ha diversi metodi statici che uso per scrivere un flusso (o una matrice di byte se necessario) in un file temporaneo. Ecco un esempio semplificato di un tale metodo:

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

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

    return FileName; 
} 

Poi, ho un altro metodo che accetta un percorso di file per l'eliminazione successiva, che è un membro della mia classe 'analisi', anche se si potrebbe mettere nella propria statica classe di supporto:

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

    return path; 
} 

Infine, effettuare le seguenti operazioni:

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

Questo è il modo migliore che è venuta in mente per aggirare la mancanza di un'API di capacità di gestione del flusso.

0

Io uso questa soluzione:

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)) { } 
      } 
     } 
    } 
} 

Ogni volta che è necessario l'uso di file temporanei:

var tempFile = TemporaryFiles.UseNew(); 

per essere sicuri che tutti i file temporanei vengono eliminati dopo l'applicazione si chiude o si blocca messo

TemporaryFiles.DeleteAllPreviouslyUsed(); 

all'avvio dell'applicazione.

Problemi correlati