在c#中从流对象创建临时文件

Yai*_*vet 9 c# idisposable using stream

给定一个包含xlsx文件的流对象,我想将其保存为临时文件,并在不再使用该文件时将其删除.

我想创建一个class实现IDisposable并与using代码块一起使用它以便在最后删除临时文件.

知道如何将流保存到临时文件并在使用结束时将其删除?

谢谢

Dar*_*rov 26

您可以使用TempFileCollection类:

using (var tempFiles = new TempFileCollection())
{
    string file = tempFiles.AddExtension("xlsx");
    // do something with the file here 
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,即使抛出异常,也可以保证临时文件被删除using.默认情况下,这会将文件生成到系统上配置的临时文件夹中,但您也可以在调用TempFileCollection构造函数时指定自定义文件夹.


Jon*_*Jon 9

您可以获取临时文件名Path.GetTempFileName(),创建一个FileStream以写入它并用于Stream.CopyTo将输入流中的所有数据复制到文本文件中:

var stream = /* your stream */
var fileName = Path.GetTempFileName();

try
{
    using (FileStream fs = File.OpenWrite(fileName))
    {
        stream.CopyTo(fs);
    }

    // Do whatever you want with the file here
}
finally
{
    File.Delete(fileName);
}
Run Code Online (Sandbox Code Playgroud)


And*_*tos 8

这里的另一种方法是:

string fileName = "file.txt";
int bufferSize = 4096;

var fileStream = System.IO.File.Create(fileName, bufferSize, System.IO.FileOptions.DeleteOnClose)

// now use that fileStream to save the xslx stream
Run Code Online (Sandbox Code Playgroud)

这样,文件将在关闭后被删除.

编辑:

如果您不需要流存活太长时间(例如:只有一个写操作或单个循环来写...),您可以按照建议将此流包装到使用块中.这样您就不必手动处理它.

代码如下:

string fileName = "file.txt";
int bufferSize = 4096;

using(var fileStream = System.IO.File.Create(fileName, bufferSize, System.IO.FileOptions.DeleteOnClose))
{
    // now use that fileStream to save the xslx stream
}
Run Code Online (Sandbox Code Playgroud)