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构造函数时指定自定义文件夹.
您可以获取临时文件名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)
这里的另一种方法是:
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)