いくつかのビットマップを作成してファイル システムに保存する必要があります。何らかの理由で、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();
アプリケーションの開始時。