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

4
我正在使用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,则该进程会释放该文件,然后我可以加载该页面并正常读取文件。在重定向之前,是否需要执行某些操作以关闭文件?

4个回答

9

您是否关闭了由File.Create返回的流?名称有点令人困惑(它来自WinAPI的深处),但它为您创建并打开了一个文件以供写入。


啊,我甚至没有注意到它返回了一个流。非常感谢!我会在能够接受时接受 :) - Chev

7

File.Create返回FileStream,尝试使用以下代码:

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

或者更短:

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

这也可以。在Matti的回答之后,我发现使用File.Create(.....).Dispose();更容易。谢谢cichy。 - Chev

4

尝试替换:

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

使用:

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

因此,文件句柄会立即被处理/释放。


3

仅需关闭它:

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

如果您要对已创建文件进行操作,最好使用 using 块来包装此逻辑,最终会关闭句柄:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接