.Net中的临时文件

时间:2009-09-23 22:25:17

标签: .net temporary-files

我需要创建一些位图并将它们保存到文件系统中。由于某种原因,MScharting系统希望它的后台文件作为字符串形式的路径提供。

我正在动态创建背景图片,虽然只有几次。

创建这些文件然后清理它们的最佳方法是什么?

4 个答案:

答案 0 :(得分:14)

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

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

使用此文件名创建文件&路径,当你完成删除它。

答案 1 :(得分:10)

最好的办法是拥有一个实现IDisposable的TemporaryFileManager;你问它的临时文件,它自动生成并粘贴在某个临时目录中,然后当你或者终结器(如果你已经正确实现了一次性模式)放置了TemporaryFileManager时它们都被删除了

答案 2 :(得分:1)

在我的项目中,我有一个名为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缺乏流处理功能而提出的最好方法。

答案 3 :(得分:0)

我使用这个解决方案:

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();

在申请开始时。