Вопрос

Мне нужно создать несколько растровых изображений и сохранить их в файловой системе.По какой-то причине система MScharting хочет, чтобы ее фоновые файлы предоставлялись в виде путей в строковой форме.

Я динамически создаю фоновое изображение, хотя и всего несколько раз.

Каков наилучший способ создать эти файлы, а затем очистить их?

Это было полезно?

Решение

Лучше всего иметь TemporaryFileManager, который реализует IDisposable;вы запрашиваете у него временные файлы, которые он автоматически генерирует и помещает куда-нибудь во временный каталог, затем все они удаляются при удалении TemporaryFileManager либо вами, либо финализатором (если вы правильно внедрили одноразовый шаблон)

Другие советы

Вот как вы можете получить полный путь и имя файла временного файла:

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

Создайте файл, используя это имя файла и путь, и когда вы закончите, удалите его.

В моих проектах у меня есть вспомогательный класс под названием TempFile .В нем есть несколько статических методов, которые я использую для записи потока (или массива байтов, если необходимо) во временный файл.Вот упрощенный пример такого метода:

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

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

   return FileName;
}

Затем у меня есть другой метод, который принимает путь к файлу для последующего удаления, который является членом моего класса 'parsing', хотя вы могли бы поместить его в собственный статический вспомогательный класс:

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

   return path;
}

Наконец, я делаю следующее:

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

Это лучший способ, который я придумал для обхода недостатка возможностей API по обработке потоков.

Я использую это решение:

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

Каждый раз, когда вам нужно использовать временный файл:

var tempFile = TemporaryFiles.UseNew();

Чтобы убедиться, что все временные файлы удаляются после закрытия или сбоя приложения, поместите

TemporaryFiles.DeleteAllPreviouslyUsed();

при запуске приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top