2009-09-23 38 views
10

我需要創建一些位圖並將它們保存到文件系統。出於某種原因,MScharting系統希望它將背景文件供應作爲字符串形式的路徑。.Net中的臨時文件

我在動態創建背景圖片,雖然只有幾次。

什麼是創建這些文件然後清理它們的最佳方式?

+0

你確定你調用的方法沒有任何重載而不是路徑嗎? – MusiGenesis 2009-09-23 23:03:19

+0

我知道有一堆MS庫只接受路徑(DirectX是一個想到的)。它通常被認爲是糟糕的API設計,但有時你沒有太多的選擇,缺少設置RAM磁盤。 – 2009-09-23 23:51:03

回答

9

最好的辦法是有一個實現IDisposable的TemporaryFileManager;你問它臨時文件,它會自動生成並粘貼在某個臨時目錄中,然後當TemporaryFileManager被你或者終結器(如果你已經正確實現了一次性模式)處置時它們全部被刪除。

14

這裏是你如何能得到一個臨時文件的完整路徑和文件名:

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

使用這個文件名&路徑創建該文件,當你完成刪除。

+0

由於某些未知的原因,此方法有時並不可靠,並且可能會拋出System.IO.IOException:該文件可用 – 2014-05-07 08:27:07

1

在我的項目中,我有一個名爲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的缺乏流處理能力的最佳途徑。

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(); 
後,所有臨時文件都將被刪除

在應用程序的開始。