如何在C#中创建一个临时文件(用于写入)?
Possible Duplicate: Creating tempory folders
我正在寻找类似Python中的tempfile
模块的东西:一种(最好)安全的方式来打开要写入的文件。完成后,这也应该很容易删除...
似乎.NET不具有tempfile
模块的"包含电池"功能,该功能不仅创建文件,而且还将文件描述符(我知道,老派)与路径一起返回给它。同时,它确保只有创建用户才能访问文件,而不能访问文件(我认为是" mkstemp()"):https://docs.python.org/library/tempfile.html
嗯,是的,我可以看到。但是GetTempFileName确实有一个缺点:创建文件(调用GetTempFileName时会创建0字节文件)与打开它(返回GetTempFileName之后)之间存在争用条件。尽管不是我当前的应用程序,但这可能是一个安全问题。
解决方案
回答
我不知道有任何内置的(框架内)类可以做到这一点,但我想推出自己的解决方案不会有太大的问题。
显然,这取决于要写入的数据类型以及所需的"安全性"。
关于DevFusion的这篇文章可能是一个不错的起点?
回答
Path.GetTempFileName和Path.GetTempPath。然后,我们可以使用此链接将加密的数据读取/写入文件。
请注意,.NET并不是用于关键安全应用程序的最佳平台。我们必须精通CLR的工作方式,以避免某些可能使关键数据暴露给黑客的陷阱。
编辑:关于竞赛条件...我们可以使用GetTempPath,然后通过使用创建临时文件名
Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Guid.NewGuid().ToString(), ".TMP"))
回答
我之前也有相同的要求,并且创建了一个小类来解决它:
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... }