【问题标题】:ASP.NET MVC 2: "The process cannot access the file <filename> because it is being used by another process."ASP.NET MVC 2:“进程无法访问文件 <filename>,因为它正被另一个进程使用。”
【发布时间】:2010-08-26 13:27:24
【问题描述】:

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

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

但是我在黄屏死机中不断收到此错误:

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

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

有什么想法吗?

【问题讨论】:

  • 您是否在您提供的代码行之前访问该文件?如果是这样,您是如何访问它的?
  • @Baddie:啊,我实际上是使用 File.Open 在渲染带有下载链接的页面时获取文件的长度,并且从未关闭它。将其添加为答案,我会接受。

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


【解决方案1】:

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

访问文件时,尽量使用以下方式避免文件流冲突:

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

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

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

【讨论】:

  • 致任何有同样问题的人:我在代码的另一部分使用FileMode.Open 打开了文件,但从未关闭它。
【解决方案2】:

您收到此消息时是否已打开文件?

如果您这样做,可能是 Adob​​e 锁定了文件。

【讨论】:

  • 我没有打开它。其他文件也会发生这种情况,例如图像。
【解决方案3】:

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

如果您在错误发生时可以访问服务器,则可以使用Process Explorer 之类的工具来查看究竟是什么锁定了文件。

【讨论】:

  • 使用 Process Explorer 我发现我唯一无法访问该文件的情况是 devenv.exe(或更具体地说是 WebDev.WebServer.exe)获取该文件时。只要它不这样做,我就可以下载它就好了。现在我需要做的就是弄清楚为什么会这样?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2015-12-07
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多