如何在 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# 中创建一个临时文件(用于写入)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章