2009-09-23 13 views
10

Ich muss einige Bitmaps erstellen und sie im Dateisystem speichern. Aus irgendeinem Grund möchte das MSchart-System seine Hintergrunddateien als Pfade in Form von Strings bereitstellen.Temporäre Dateien in .Net

Ich erstelle dynamisch das Hintergrundbild, obwohl nur ein paar Mal.

Was ist der beste Weg, um diese Dateien zu erstellen und sie dann zu bereinigen?

+0

Sind Sie sicher, dass die Methoden, die Sie aufrufen, keine Überladungen haben, die Streams anstelle von Pfaden verwenden? – MusiGenesis

+0

Ich weiß, dass es eine Reihe von MS-Bibliotheken gibt, die nur Pfade akzeptieren (DirectX ist eines, das mir in den Sinn kommt). Es wird allgemein als schlechtes API-Design betrachtet, aber manchmal haben Sie keine große Auswahl, abgesehen von der Einrichtung einer RAM-Disk. –

Antwort

9

Ihre beste Wette ist ein temporärer Dateimanager, der IDisposable implementiert; Sie fragen nach temporären Dateien, die automatisch generiert werden und sich irgendwo in einem temporären Verzeichnis befinden, dann werden sie alle gelöscht, wenn der TemporaryFileManager entweder von Ihnen oder dem Finalizer entfernt wird (wenn Sie das Disposable-Muster korrekt implementiert haben)

14

Hier ist, wie Sie den vollständigen Pfad und Dateinamen einer temporären Datei bekommen können:

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

Erstellen Sie die Datei mit diesem Dateinamen & Pfad und wenn Sie es fertig sind zu löschen.

+0

Aus unbekannten Gründen ist diese Methode manchmal nicht zuverlässig und kann System.IO.IOException werfen: Die Datei ist verfügbar –

1

In meinen Projekten habe ich eine Hilfsklasse namens TempFile. Es hat mehrere statische Methoden, die ich verwenden, um einen Stream (oder ein Array von Bytes, falls erforderlich) in eine temporäre Datei zu schreiben. Hier ist ein vereinfachtes Beispiel eines solchen Verfahrens:

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

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

    return FileName; 
} 

Dann habe ich eine andere Methode, die einen Dateipfad für die spätere Löschung akzeptiert, die ein Mitglied meiner ‚Parsen‘ Klasse ist, obwohl man es in seiner eigenen statischen setzen könnte Hilfsklasse:

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

    return path; 
} 

Schließlich habe ich wie folgt vor:

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

Dies ist der beste Weg ist, ich habe mit zum umgehen eines API Mangel an Strom Handling-Fähigkeiten kommen.

0

Ich benutze diese Lösung:

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

Jedes Mal, wenn Sie temporäre Datei verwenden müssen:

var tempFile = TemporaryFiles.UseNew(); 

Um sicherzustellen, dass alle temporären Dateien gelöscht werden, nach der Anwendung schließt oder Abstürze setzen

TemporaryFiles.DeleteAllPreviouslyUsed(); 

zu Beginn der Anwendung.

Verwandte Themen