【发布时间】:2013-04-10 18:37:40
【问题描述】:
我在 C# MVC 应用程序中有一个函数,它创建一个临时目录和一个临时文件,然后使用 FileStream 打开文件,将 FileStream 返回给调用函数,然后需要删除临时文件。但是,我不知道如何删除临时目录和文件,因为它总是错误地说“该进程无法访问该文件,因为它正在被另一个进程使用。”这是我尝试过的,但 FileStream 仍在 finally 块中使用临时文件。如何返回 FileStream 并删除临时文件?
public FileStream DownloadProjectsZipFileStream()
{
Directory.CreateDirectory(_tempDirectory);
// temporary file is created here
_zipFile.Save(_tempDirectory + _tempFileName);
try
{
FileStream stream = new FileStream(_tempDirectory + _tempFileName, FileMode.Open);
return stream;
}
finally
{
File.Delete(_tempDirectory + _tempFileName);
Directory.Delete(_tempDirectory);
}
}
FileStream 返回的函数如下所示:
public ActionResult DownloadProjects ()
{
ProjectDownloader projectDownloader = new ProjectDownloader();
FileStream stream = projectDownloader.DownloadProjectsZipFileStream();
return File(stream, "application/zip", "Projects.zip");
}
更新:我忘了说 zip 文件是 380 MB。使用 MemoryStream 时出现系统内存不足异常。
【问题讨论】:
-
FileStream已经打开了文件,为什么还指望可以删除文件呢?这将使返回的FileStream无法使用。 -
_zipFile 的类型是什么?
-
你真的不需要这个文件,而是保存到内存流中。
-
使用内存流允许我删除临时文件,但在将文件流复制到内存流时出现“系统内存不足异常”。顺便说一下,zip 文件是 380 MB。
-
@WiktorZychla 使用
MemoryStream在大文件的内存使用方面效率极低,尤其是在目标只需要处理文件而不是全部读取的情况下;如果它确实需要全部读入,则会导致双倍的内存使用。
标签: c# asp.net-mvc file-io filestream temporary-files