Question

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 c'est des fournitures de fichiers de fond comme les chemins sous forme de chaîne.

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

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

Était-ce utile?

La solution

Votre meilleur pari est d'avoir un TemporaryFileManager qui implémente IDisposable; vous demandez des fichiers temporaires, qu'il autogénère et des bâtons dans un répertoire temporaire quelque part, alors ils sont tous sont supprimés lorsque le TemporaryFileManager se disposé, que ce soit par vous ou le finaliseur (si vous avez mis en place correctement le modèle à usage unique)

Autres conseils

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

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

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

Dans mes projets, j'ai une classe d'aide appelée tempfile. Il dispose de plusieurs méthodes statiques que j'utiliser pour écrire un flux (ou un tableau d'octets le cas échéant) à 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 sa propre classe d'aide statique:

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

   return path;
}

Enfin, je fais ce qui suit:

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

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

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 avez besoin d'utiliser de fichier temporaire:

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top