ASP.NET MVC 2:“进程无法访问文件<filename>,因为它正由另一个进程使用。”</filename>

时间:2010-08-26 13:27:24

标签: asp.net-mvc asp.net-mvc-2 filestream

我正在尝试使用Controller.File从我的ASP.NET MVC 2项目中的视图返回FilePathResult。我这样用它:

return File(pdfFilePath, "application/pdf", "foo.pdf");

但是我在死亡的黄色屏幕上一直收到这个错误:

进程无法访问文件[文件路径],因为它正由另一个进程使用。

当您忘记关闭文件流时,通常会出现此错误,但我认为这应该由ASP.NET MVC框架处理。这不会发生每个时间,而是定期发生。有时我得到的文件很好,但它只是停止工作。我在测试时使用的是开发服务器。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您是否在提供的代码行之前访问该文件?如果是这样,你如何访问它?

访问文件时,请尝试使用以下内容以避免文件流冲突:

File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

最后一个枚举FileShare.ReadWrite将允许其他文件流读取和写入文件,即使它已打开。当然,最好记住尽快关闭你的流。

http://msdn.microsoft.com/en-us/library/y973b725.aspx

答案 1 :(得分:0)

收到此消息后,您是否已打开该文件?

如果你这样做,可能是Adobe锁定文件。

答案 2 :(得分:0)

最有可能的情况是ASP.NET / IIS之外的其他内容打开了文件。发生此错误时,您是否确保没有其他进程锁定文件?

如果您在发生错误时有权访问服务器,则可以使用Process Explorer之类的工具查看确切锁定文件的内容。

答案 3 :(得分:0)

锁定可以在asp.net内部发生 - 因为asp.net显示线程敏捷性,因此它可能是完成请求的asp.net线程池内的另一个线程。这就是为什么你只能间歇地看到这个问题。 Baddie的答案基本上是你问题的解决方案。另外,如果您使用的资源包含声明为threadstatic的状态,您可能会发现其他问题。如果是这种情况,您可能需要考虑使用CallContext。