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

Posted

技术标签:

【中文标题】如何在 C# 中创建一个临时文件(用于写入)? [复制]【英文标题】:How to create a temporary file (for writing to) in C#? [duplicate] 【发布时间】: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吗? 【参考方案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 可能是一个不错的起点?

【讨论】:

以上是关于如何在 C# 中创建一个临时文件(用于写入)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:在Python中创建临时文件用于记录临时数据

如何在 SQL 中创建临时表以用于多个 ADF 活动?

C#:在计算机中创建虚拟驱动器

如何在 C# 中创建 Microsoft Access 数据库? [复制]

在java中创建命名管道

如何将在我的 Javascript 中创建的字符串数组传递给 C# 代码隐藏文件?