2008-08-21 59 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

相关问题