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

17
我正在寻找类似于Python中的tempfile模块的东西:一种(最好)安全的打开文件进行写入的方法。完成后应该很容易删除...。然而,.NET似乎没有tempfile模块“内置的电池功能”,它不仅创建文件,而且返回文件描述符(老派了,我知道...)以及路径。同时,它确保只有创建用户可以访问文件等(我认为是mkstemp()):https://docs.python.org/library/tempfile.html
啊,是的,我能看到这一点。但是GetTempFileName有一个缺点:在文件创建时(在调用GetTempFileName时创建0字节文件)和我打开它之间存在竞争条件。虽然对于我的当前应用程序来说可能不是安全问题...。

我没有看到 Path.GetTempDirectory 方法,它难道不是 System.IO.GetTempPath 吗? - Biri
3个回答

32

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

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)是危险的,不是吗? - Kiquenet
18
刀剑本身危险吗?还是使用刀剑的武士更加危险呢? - Jordão

10

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

请注意,.NET不是最适合关键安全应用程序的平台。为了避免可能会将关键数据暴露给黑客的一些陷阱,您必须精通CLR的工作方式。

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

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

0

我不知道是否有任何内置(在框架内)的类可以做到这一点,但我想自己编写应该不是什么大问题。

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

DevFusion上的这篇文章可能是一个很好的起点?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接