【问题标题】:How to create a temporary file (for writing to) in C#? [duplicate]如何在 C# 中创建一个临时文件(用于写入)? [复制]
【发布时间】:2010-09-06 09:59:12
【问题描述】:

可能重复:
Creating tempory folders

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

.NET 似乎没有tempfile 模块的“包含电池”功能,它不仅会创建文件,还会将文件描述符(老派,我知道......)连同它一起返回给它路径。同时,它确保只有创建用户才能访问文件和诸如此类的东西(mkstemp() 我认为):https://docs.python.org/library/tempfile.html


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

【问题讨论】:

  • 没见过Path.GetTempDirectory,不是System.IO.GetTempPath吗?

标签: c# temporary-files


【解决方案1】:

我之前也有过同样的需求,特地创建了一个小类来解决:

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

【讨论】:

  • 像 ~TemporaryFile 这样的终结器方法很危险,不是吗???
  • 剑危险吗?还是使用它的武士?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    DevFusion 上的This article 可能是一个不错的起点?

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多