2008-08-21 58 views
14

可能重複:
Creating tempory folders如何在C#中創建臨時文件(用於寫入)?

我正在尋找類似的tempfile模塊中的Python:打開一個文件用於寫入A(最好)安全的方式。這應該很容易刪除,當我完成了...

看來,.NET沒有tempfile模塊的「電池包括」功能,它不僅創建文件,但返回文件描述符(舊學校,我知道......)和路徑一起。同時,它可以確保只有創建用戶可以訪問該文件和諸如此類的東西(mkstemp()我認爲):https://docs.python.org/library/tempfile.html


嗯,是的,我可以看到。但GetTempFileName確實有一個缺點:創建文件時(在調用GetTempFileName時創建了0字節文件)以及何時打開它(返回GetTempFileName之後)之間存在爭用條件。這可能是一個安全問題,雖然不是我當前的應用程序...

+0

我還沒有看到Path.GetTempDirectory,是不是System.IO.GetTempPath? – Biri 2008-08-21 14:54:21

回答

0

我不知道任何內置(在框架內)類來做到這一點,但我想它不會太多問題推出自己的..

顯然,這取決於你想寫信給它的數據類型,以及所要求的「安全」 ..

This article上DevFusion可能是一個良好的開端?

6

Path.GetTempFileName和Path.GetTempPath。然後,您可以使用this link將加密數據讀取/寫入文件。

注意,.NET不是關鍵安全應用程序的最佳平臺。您必須熟悉CLR的工作方式,以避免可能使您的關鍵數據暴露給黑客的一些陷阱。

編輯:關於競爭條件......你可以使用GetTempPath,然後用

Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP")) 
+0

@Maciej:對! – Will 2012-10-04 13:15:57

23

創建一個臨時文件名我也有同樣的要求之前,我已經創建了一個小班解決它:

public sealed class TemporaryFile : IDisposable { 
    public TemporaryFile() : 
    this(Path.GetTempPath()) { } 

    public TemporaryFile(string directory) { 
    Create(Path.Combine(directory, Path.GetRandomFileName())); 
    } 

    ~TemporaryFile() { 
    Delete(); 
    } 

    public void Dispose() { 
    Delete(); 
    GC.SuppressFinalize(this); 
    } 

    public string FilePath { get; private set; } 

    private void Create(string path) { 
    FilePath = path; 
    using (File.Create(FilePath)) { }; 
    } 

    private void Delete() { 
    if (FilePath == null) return; 
    File.Delete(FilePath); 
    FilePath = null; 
    } 
} 

它在您指定的文件夾或系統臨時文件夾中創建一個臨時文件。它是一次性類,所以在其生命結束時(Dispose或析構函數),它會刪除文件。您將獲得通過FilePath屬性創建的文件的名稱(和路徑)。您當然可以擴展它來打開文件進行寫入並返回其相關的FileStream

使用示例:

using (var tempFile = new TemporaryFile()) { 
    // use the file through tempFile.FilePath... 
} 
+0

finalizers方法像〜TemporaryFile是危險的,不是? – Kiquenet 2010-08-02 09:49:01

相關問題