.net Net中的临时文件

.net Net中的临时文件,.net,temporary-files,.net,Temporary Files,我需要创建一些位图并将其保存到文件系统。出于某种原因,MScharting系统希望其后台文件以字符串形式提供路径 我正在动态创建背景图像,虽然只创建了几次 创建并清理这些文件的最佳方法是什么?以下是获取临时文件的完整路径和文件名的方法: string tempFile = System.IO.Path.GetTempFileName(); 使用此文件名和路径创建文件,完成后将其删除 最好的选择是有一个临时文件管理器来实现IDisposable;您向它请求临时文件,它会自动生成临时文件并将其粘贴

我需要创建一些位图并将其保存到文件系统。出于某种原因,MScharting系统希望其后台文件以字符串形式提供路径

我正在动态创建背景图像,虽然只创建了几次


创建并清理这些文件的最佳方法是什么?

以下是获取临时文件的完整路径和文件名的方法:

string tempFile = System.IO.Path.GetTempFileName();

使用此文件名和路径创建文件,完成后将其删除

最好的选择是有一个临时文件管理器来实现IDisposable;您向它请求临时文件,它会自动生成临时文件并将其粘贴到某个临时目录中,然后在临时文件管理器被您或终结器(如果您正确实现了一次性模式)处理后,它们都会被删除。

在我的项目中,我有一个名为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();

在应用程序开始时。

您确定要调用的方法没有任何采用流而不是路径的重载吗?我知道有很多MS库只接受路径(我想到的是DirectX)。它通常被认为是糟糕的API设计,但有时除了设置RAM磁盘之外,您没有太多选择。由于未知原因,此方法有时不可靠,可能引发System.IO.IOException:文件可用