2014-10-30 27 views
0

我試圖從網站下載圖像並將其放入圖片框中。C#進程無法訪問文件(僅限第二次)

// 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

可能重複的[如何防止Image.FromFile()方法鎖定文件](http://stackoverflow.com/questions/18250848/how-to-prevent-the-image -fromfile-method-to-lock-the-file) – Chris 2014-10-30 21:34:38

+0

謝謝克里斯,正是我在找的東西。對不起。 – 2014-10-30 21:38:19

+0

不客氣。 – Chris 2014-10-30 21:40:01

回答

0

Image.FromFile docs的狀態:

文件保持鎖定,直到Image設置。

所以你需要處置你的Image也不能覆蓋文件。

嘗試在您的圖像上使用Clone方法並處置原始的Image

0

這件事與Image.FromFile有關。如果我們閱讀文檔,有一個註釋:

該文件保持鎖定狀態,直到圖像被丟棄。

這很好的解釋了你得到的行爲。

要解決此問題,您可能需要創建圖像的副本並將其指定爲PictureBox

0

從MSDN:

文件保持鎖定,直到圖像被佈置。

這意味着它的PictureBox是保持打開文件。

你有兩個選擇:

  • PictureBox圖像處置寫入新文件之前。

  • 下載該文件,複製該文件並將該副本加載到PictureBox - 這允許您自由地寫下下載的文件。

0

我會在這裏逆勢而行。 :)

雖然克隆/複製圖像將解決異常,但它引發了一個不同的問題:爲什麼要覆蓋同一個文件以獲取新圖像?

在我看來,更好的方法是將後續文件下載到不同的文件名(如果它們實際上是不同的文件),或者簡單地重複使用已下載的文件而不是再次點擊網絡(如果它只是一個對同一文件的新請求)。

即使您想重複下載相同的文件(也許您期望實際的文件內容發生變化),仍然可以下載到一個新名稱(例如,在文件名中附加一個數字,使用本地GUID文件名等)

相關問題