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

时间:2020-03-05 18:41:33  来源:igfitidea点击:
Possible Duplicate:

  Creating tempory folders

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

似乎.NET不具有tempfile模块的"包含电池"功能,该功能不仅创建文件,而且还将文件描述符(我知道,老派)与路径一起返回给它。同时,它确保只有创建用户才能访问文件,而不能访问文件(我认为是" mkstemp()"):https://docs.python.org/library/tempfile.html

嗯,是的,我可以看到。但是GetTempFileName确实有一个缺点:创建文件(调用GetTempFileName时会创建0字节文件)与打开它(返回GetTempFileName之后)之间存在争用条件。尽管不是我当前的应用程序,但这可能是一个安全问题。

解决方案

回答

我不知道有任何内置的(框架内)类可以做到这一点,但我想推出自己的解决方案不会有太大的问题。

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

关于DevFusion的这篇文章可能是一个不错的起点?

回答

Path.GetTempFileName和Path.GetTempPath。然后,我们可以使用此链接将加密的数据读取/写入文件。

请注意,.NET并不是用于关键安全应用程序的最佳平台。我们必须精通CLR的工作方式,以避免某些可能使关键数据暴露给黑客的陷阱。

编辑:关于竞赛条件...我们可以使用GetTempPath,然后通过使用创建临时文件名

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

回答

我之前也有相同的要求,并且创建了一个小类来解决它:

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