2009-09-23 8 views
10

Je dois créer des bitmaps et les enregistrer dans le système de fichiers. Pour une raison quelconque, le système MScharting veut que ses fichiers d'arrière-plan soient des chemins sous forme de chaîne.Fichiers temporaires dans .Net

Je crée dynamiquement l'image d'arrière-plan, mais seulement quelques fois.

Quelle est la meilleure façon de créer ces fichiers, puis de les nettoyer?

+0

Etes-vous sûr que les méthodes que vous appelez n'ont pas de surcharges qui prennent des flux au lieu de chemins? – MusiGenesis

+0

Je sais qu'il y a un tas de bibliothèques MS qui n'acceptent que les chemins (DirectX est celui qui me vient à l'esprit). Il est généralement considéré comme une mauvaise conception d'API, mais parfois vous n'avez pas beaucoup de choix, à moins de configurer un disque RAM. –

Répondre

9

Votre meilleur pari est d'avoir un TemporaryFileManager qui implémente IDisposable; vous le demandez pour des fichiers temporaires, qu'il génère automatiquement et qu'il place dans un répertoire temp quelque part, puis ils sont tous supprimés lorsque le TemporaryFileManager est éliminé, soit par vous-même ou par le finaliseur (si vous avez correctement implémenté le modèle jetable)

14

Voici comment vous pouvez obtenir le chemin complet et le nom de fichier d'un fichier temporaire:

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

Créer le fichier en utilisant ce chemin et nom de fichier & lorsque vous avez terminé le supprimer.

+0

Pour des raisons inconnues cette méthode n'est parfois pas fiable et peut lancer System.IO.IOException: Le fichier est disponible –

1

Dans mes projets, j'ai une classe d'assistance appelée TempFile. Il a plusieurs méthodes statiques que j'utilise pour écrire un flux (ou un tableau d'octets si nécessaire) dans un fichier temporaire. Voici un exemple simplifié d'une telle méthode:

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

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

    return FileName; 
} 

Ensuite, j'ai une autre méthode qui accepte un chemin de fichier pour la suppression ultérieure qui est un membre de ma classe « parsing », bien que vous pouvez le mettre dans son propre statique classe aide:

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

    return path; 
} 

Enfin, je fais ce qui suit:

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

C'est la meilleure façon que je suis venu avec pour contourner le manque de capacités de traitement des flux d'une API.

0

J'utilise cette solution:

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

Chaque fois que vous devez utiliser des fichiers temporaires:

var tempFile = TemporaryFiles.UseNew(); 

Pour être sûr que tous les fichiers temporaires sont supprimés après l'application se ferme ou se bloque mis

TemporaryFiles.DeleteAllPreviouslyUsed(); 

au début de l'application.

Questions connexes