C#进程无法访问文件(仅限第二次)

时间:2014-10-30 21:25:33

标签: c# io stream filestream outputstream

我正在尝试从网站下载图像并将其放入图片框中。

    // response contains HttpWebResponse of the page where the image is 
    using (Stream inputStream = response.GetResponseStream()) {
                using (Stream outputStream = File.Open(fileName, FileMode.Create)) {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);
                }
            }
    response.Close();

之后,将下载的图像分配给PictureBox,如下所示:

    if (imageDownloaded) {
            pictureBox1.Image = Image.FromFile(filePath);
    }

这一切都像魅力第一次,但第二次我运行代码我得到System.IO.IOException:" 附加信息:进程无法访问文件...(文件路径)...因为它被另一个进程使用。"。我不知道为什么......

我看了其他4个线程,比如这个,但是他们基本上强调了关闭流的必要性,我这样做,所以没有人帮助过我。

在您建议使用pictureBox1.Load()之前,我不能这样做,因为我需要下载图片以供进一步开发。

编辑1 :我实际上尝试在执行上面的代码之前放置pictureBox1.Image = null来处理图像。它仍然给我一个例外。

4 个答案:

答案 0 :(得分:0)

Image.FromFile docs州:

  

文件保持锁定状态,直到Image被处理。

所以你需要处理你的Image以便能够覆盖文件。

尝试在图片上使用Clone方法并处理原始Image

答案 1 :(得分:0)

这件事与Image.FromFile有关。如果我们阅读文档,请注意:

  

文件保持锁定状态,直到图像被丢弃。

这几乎解释了你得到的行为。

要解决此问题,您可能需要创建图片副本并将 it 分配给PictureBox

答案 2 :(得分:0)

来自MSDN:

  

文件保持锁定状态,直到图像被丢弃。

这意味着它保持文件打开的PictureBox

您有两种选择:

  • 在写入新文件之前处理PictureBox图片。

  • 下载文件,复制文件并将副本加载到PictureBox - 这样您就可以自由地书写下载的文件。

答案 3 :(得分:0)

我会在这里成为逆势者。 :)

虽然克隆/复制图像将解决异常,但它提出了一个不同的问题:为什么要覆盖同一个文件以获取新图像?

在我看来,更好的方法是将后续文件下载到不同的文件名(如果它们是非常不同的文件),或者只是重复使用已经下载的文件而不是再次访问网络(如果它'只是对同一文件的新请求。)

即使您想重复下载相同的文件(也许您希望更改实际文件内容),您仍然可以下载到新名称(例如,在文件名后附加一个数字,使用本地文件的GUID)名称等。)