我需要創建一些位圖並將它們保存到文件系統。出於某種原因,MScharting系統希望它將背景文件供應作爲字符串形式的路徑。.Net中的臨時文件
我在動態創建背景圖片,雖然只有幾次。
什麼是創建這些文件然後清理它們的最佳方式?
我需要創建一些位圖並將它們保存到文件系統。出於某種原因,MScharting系統希望它將背景文件供應作爲字符串形式的路徑。.Net中的臨時文件
我在動態創建背景圖片,雖然只有幾次。
什麼是創建這些文件然後清理它們的最佳方式?
最好的辦法是有一個實現IDisposable的TemporaryFileManager;你問它臨時文件,它會自動生成並粘貼在某個臨時目錄中,然後當TemporaryFileManager被你或者終結器(如果你已經正確實現了一次性模式)處置時它們全部被刪除。
這裏是你如何能得到一個臨時文件的完整路徑和文件名:
string tempFile = System.IO.Path.GetTempFileName();
使用這個文件名&路徑創建該文件,當你完成刪除。
由於某些未知的原因,此方法有時並不可靠,並且可能會拋出System.IO.IOException:該文件可用 – 2014-05-07 08:27:07
在我的項目中,我有一個名爲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();
後,所有臨時文件都將被刪除
在應用程序的開始。
你確定你調用的方法沒有任何重載而不是路徑嗎? – MusiGenesis 2009-09-23 23:03:19
我知道有一堆MS庫只接受路徑(DirectX是一個想到的)。它通常被認爲是糟糕的API設計,但有時你沒有太多的選擇,缺少設置RAM磁盤。 – 2009-09-23 23:51:03