【问题标题】:process cannot access the file because it is being used by another process进程无法访问该文件,因为它正被另一个进程使用
【发布时间】:2012-01-25 16:50:04
【问题描述】:

我正在使用带有 C# 的 ASP.NET Webforms。在一个页面上,我单击提交以在服务器上创建一个文件。

File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"])
            + landingPage.FriendlyName);

这可以正常工作并按预期创建文件。但是,在它这样做之后,它会重定向到另一个页面,该页面会读取刚刚创建的文件。

var landingPageContent 
       = File.ReadAllText(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) 
                          + landingPage.FriendlyName);

那是我收到此错误的时候。

该进程无法访问文件 'c:\code\Content\CMS\LandingPages\Test2',因为它正被另一个进程使用。

如果我重新启动 IIS,那么进程会释放文件,我可以加载该页面并正常读取文件。在File.Create 之后我需要做些什么才能在重定向之前关闭文件吗?

【问题讨论】:

    标签: c# asp.net .net webforms io


    【解决方案1】:

    您是否关闭了File.Create 返回的流?这个名字有点令人困惑(它完全来自 WinAPI 的内部),但它会创建一个文件打开它以便为您编写。

    【讨论】:

    • 啊,我什至没有注意到它返回了一个流。非常感谢!我会接受的:)
    【解决方案2】:

    File.Create 返回 Filstream,试试这个:

    using (FileStream fs = System.IO.File.Create(...)){}
    

    或更短:

    File.Create(...).Dispose();
    

    【讨论】:

    • 这也有效。在马蒂的回答之后,我发现File.Create(.....).Dispose(); 更容易做到。谢谢你。
    【解决方案3】:

    尝试替换:

    File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) + landingPage.FriendlyName);
    

    与:

    using(File.Create(Server.MapPath(ConfigurationManager.AppSettings["LandingPages"]) + landingPage.FriendlyName))
    {}
    

    所以文件句柄被立即处理/释放

    【讨论】:

      【解决方案4】:

      关闭它:

      var fileStream = File.Create(...);
      fileStream.Close();
      

      如果你正在对创建的文件做某事,最好用using 块包装这个逻辑,这最终会关闭一个句柄:

      using (var stream = File.Create(...))
      {
         // logic
      }
      

      【讨论】:

        猜你喜欢
        • 2010-12-10
        相关资源
        最近更新 更多