我正在尝试从网站下载图像并将其放入图片框中。
// 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
来处理图像。它仍然给我一个例外。
答案 0 :(得分:0)
答案 1 :(得分:0)
这件事与Image.FromFile有关。如果我们阅读文档,请注意:
文件保持锁定状态,直到图像被丢弃。
这几乎解释了你得到的行为。
要解决此问题,您可能需要创建图片副本并将 it 分配给PictureBox
。
答案 2 :(得分:0)
来自MSDN:
文件保持锁定状态,直到图像被丢弃。
这意味着它保持文件打开的PictureBox
。
您有两种选择:
在写入新文件之前处理PictureBox
图片。
下载文件,复制文件并将副本加载到PictureBox
- 这样您就可以自由地书写下载的文件。
答案 3 :(得分:0)
我会在这里成为逆势者。 :)
虽然克隆/复制图像将解决异常,但它提出了一个不同的问题:为什么要覆盖同一个文件以获取新图像?
在我看来,更好的方法是将后续文件下载到不同的文件名(如果它们是非常不同的文件),或者只是重复使用已经下载的文件而不是再次访问网络(如果它'只是对同一文件的新请求。)
即使您想重复下载相同的文件(也许您希望更改实际文件内容),您仍然可以下载到新名称(例如,在文件名后附加一个数字,使用本地文件的GUID)名称等。)