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

Dar*_*mas 15 c# temporary-files

可能重复:
创建临时文件夹

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

看起来,.NET没有tempfile模块的"电池包含"功能,它不仅创建文件,而且还将文件描述符(旧学校,我知道......)与路径一起返回.同时,它确保只有创建用户可以访问该文件和什么(mkstemp()我认为):https://docs.python.org/library/tempfile.html


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

Jor*_*dão 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

它会在您指定的文件夹或系统临时文件夹中创建临时文件.它是一个一次性类,所以在它的生命结束时(Dispose或者是析构函数),它会删除文件.您将通过该FilePath属性获取创建的文件(和路径)的名称.您当然可以扩展它以打开文件进行写入并返回其关联FileStream.

示例用法:

using (var tempFile = new TemporaryFile()) {
    // use the file through tempFile.FilePath...
}
Run Code Online (Sandbox Code Playgroud)

  • 剑是危险的吗?或者是使用武士的武士? (14认同)

小智 7

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

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

编辑:关于竞争条件...您可以使用GetTempPath,然后使用创建临时文件名

Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP"))
Run Code Online (Sandbox Code Playgroud)


Rob*_*per 0

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

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

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