Временные файлы в .Net
Мне нужно создать некоторые растровые изображения и сохранить их в файловой системе. По какой-то причине система MScharting хочет, чтобы исходные файлы поставлялись в виде путей в строковой форме.
Я динамически создаю фоновое изображение, хотя и несколько раз.
Какой лучший способ создать эти файлы, а затем очистить их?
Ответы
Ответ 1
Лучше всего иметь TemporaryFileManager, который реализует IDisposable; вы запрашиваете у него временные файлы, которые он автоматически генерирует и хранит в временном каталоге где-нибудь, тогда все они удаляются, когда TemporaryFileManager получает доступ, либо вами, либо финализатором (если вы правильно применили шаблон одноразового использования)
Ответ 2
Здесь вы можете получить полный путь и имя файла временного файла:
string tempFile = System.IO.Path.GetTempFileName();
Создайте файл, используя это имя файла и путь, и когда вы закончите, удалите его.
Ответ 3
В моих проектах у меня есть вспомогательный класс под названием 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 без возможностей обработки потока.
Ответ 4
Я использую это решение:
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();
в начале приложения.