如何在C#中创建临时文件(用于写入)?

时间:2008-08-21 14:50:04

标签: c# temporary-files

  

可能重复:
  Creating tempory folders

我正在寻找类似Python中的tempfile模块的东西:一种(最好)安全的方式来打开文件进行写入。当我完成时,这应该很容易删除...

看起来,.NET没有tempfile模块的“包含电池”功能,它不仅会创建文件,还会返回文件描述符(旧学校,我知道......)随着路径。同时,它确保只有创建用户才能访问该文件等等(mkstemp()我认为):https://docs.python.org/library/tempfile.html


啊,是的,我能看到。但GetTempFileName确实有一个缺点:在创建文件(调用GetTempFileName创建0字节文件)和打开它(返回GetTempFileName之后)之间存在竞争条件。这可能是一个安全问题,但不适用于我目前的应用......

3 个答案:

答案 0 :(得分:24)

之前我也有同样的要求,我已经创建了一个小类来解决它:

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...
}

答案 1 :(得分:7)

Path.GetTempFileName和Path.GetTempPath。然后,您可以使用this link将加密数据读/写到文件中。

注意,.NET不是关键安全应用程序的最佳平台。您必须精通CLR的工作原理,以避免可能将您的关键数据暴露给黑客的一些陷阱。

编辑:关于竞争条件......您可以使用GetTempPath,然后使用

创建临时文件名
Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP"))

答案 2 :(得分:0)

我不知道有任何内置(在框架内)类来执行此操作,但我认为滚动自己不会有太多问题。

显然,这取决于您要写入的数据类型,以及所需的“安全性”。

关于DevFusion的

This article可能是一个很好的起点吗?