Временные файлы в .Net
-
13-09-2019 - |
Вопрос
Мне нужно создать несколько растровых изображений и сохранить их в файловой системе.По какой-то причине система 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();
при запуске приложения.