我需要创建一些位图并将它们保存到文件系统中。出于某种原因,MScharting 系统希望它的背景文件以字符串形式提供为路径。
我正在动态创建背景图像,尽管只有几次。
创建这些文件然后清理它们的最佳方法是什么?
我需要创建一些位图并将它们保存到文件系统中。出于某种原因,MScharting 系统希望它的背景文件以字符串形式提供为路径。
我正在动态创建背景图像,尽管只有几次。
创建这些文件然后清理它们的最佳方法是什么?
以下是获取临时文件的完整路径和文件名的方法:
string tempFile = System.IO.Path.GetTempFileName();
使用此文件名和路径创建文件,完成后将其删除。
最好的办法是拥有一个实现 IDisposable 的 TemporaryFileManager;您要求它提供临时文件,它会自动生成并粘贴在某个临时目录中,然后当您或终结器处理 TemporaryFileManager 时,它们都会被删除(如果您已正确实现了一次性模式)
在我的项目中,我有一个名为 TempFile 的辅助类。它有几个静态方法,我用来将流(或字节数组,如果需要)写入临时文件。这是这种方法的简化示例:
public static string Write(Stream stream)
{
string FileName = Path.GetTempFileName();
// Write the contents of stream to a file with FileName
return FileName;
}
然后,我有另一个方法接受文件路径以供以后删除,它是我的“解析”类的成员,尽管您可以将它放在它自己的静态帮助器类中:
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();
在应用程序开始时。