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

3
我有一个ASP.NET程序,在使用WebClient类的DownloadFile方法从Web下载文件后,对其进行一些修改。然后我将其保存到另一个带有唯一名称的文件夹中。当我遇到这个错误时:

由于正在被其他进程使用,无法访问文件“D:\RD\dotnet\abc\abcimageupload\images\TempStorage\tempImage.jpg”

请问有人能告诉我如何解决这个问题吗?


1
请发布一些代码 - 否则很难确定问题所在。 - Jon Skeet
6个回答

6
通常情况下,我认为你的代码应该像这样。
WebClient wc = new WebClient();
wc.DownloadFile("http://stackoverflow.com/Content/Img/stackoverflow-logo-250.png", "Foo.png");
FileStream fooStream;
using (fooStream = new FileStream("foo.png", FileMode.Open))
{
    // do stuff
}
File.Move("foo.png", "foo2.png");

6
try/finally/fooStream.Close() 是不必要的,使用 using 就足够了。 - configurator

4
我使用SysInternals的工具追踪应用程序访问文件并导致此类问题的情况,取得了非常好的效果。Process Monitor是您需要的工具-将其设置为仅过滤您感兴趣的文件夹中的文件的输出,您将能够看到对该文件的每个访问。这样可以避免猜测问题所在。

另一个有用的调试文件锁定问题的工具是Unlocker,但它只适用于x32系统。该应用程序可在http://ccollomb.free.fr/unlocker/上获得。 - Mun

1

请尝试以下操作,将您的文件流设置为异步模式(第三个参数)

FileStream myStream = File.Create(fileName, results.Length,FileOptions.Asynchronous);
//make sure you close the file
myStream.Write(results, 0, results.Length);
myStream.Flush();
myStream.Close();
myStream.Dispose();

如果操作失败,请在访问之前重置文件的属性。
File.SetAttributes(Server.MapPath(sendFilepath), FileAttributes.Normal);

0

我不确定这是否能解决你的问题。

当我写入文本文件并尝试在之后打开它时,我遇到了完全相同的错误。

通过刷新写入器并在写入文件后关闭它来解决了这个问题。


0
你在修改完后是否明确关闭了文件流?

是的,我正在使用 file.Dispose() 方法。 - Shyju
1
如果你正在手动调用Dispose(),那么你是在finally块中这样做吗?使用"using"语句通常更好。 - Jon Skeet

0

这可能会有所帮助...抱歉它是VB而不是C,但是嘿...

这个有效

    Dim fs As FileStream = Nothing
    fs = File.Create("H:\test.txt")
    fs.Close()
    File.Delete("H:\test.txt")

这不会出现“文件正在被另一个进程使用”的错误

    File.Create("H:\test.txt")
    File.Delete("H:\test.txt")

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