2017-08-08 56 views
0

關閉正在使用的文件,這是我使用這個代碼爲Excel轉換成圖像和一個圖片預覽。代碼正在爲第一次工作。但是當我試圖上傳第二次時,我得到一個錯誤,說圖像文件正在使用,特別是在保存點。從一個PictureBox

OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
     openFileDialog1.Filter = "bak files (*.xls)|*.xls|All files (*.*)|*.*"; 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      Img1 = openFileDialog1.FileName; 


      //Create a new Workbook object and 
      //Open a template Excel file. 
      Workbook book = new Workbook(Img1); 
      //Get the first worksheet. 
      Worksheet sheet = book.Worksheets[0]; 

      //Define ImageOrPrintOptions 
      ImageOrPrintOptions imgOptions = new ImageOrPrintOptions(); 
      //Specify the image format 
      imgOptions.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg; 
      //Only one page for the whole sheet would be rendered 
      imgOptions.OnePagePerSheet = true; 

      //Render the sheet with respect to specified image/print options 
      SheetRender sr = new SheetRender(sheet, imgOptions); 
      //Render the image for the sheet 
      Bitmap bitmap = sr.ToImage(0); 

      //Save the image file specifying its image format. 
      bitmap.Save("C:\\1.jpg");\\in this point i get my error that it says general error GDI+. 

      pictureBox2.Image = Image.FromFile("C:\\1.jpg"); 
      pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; 

     } 
     else 
     { 
      this.DialogResult = DialogResult.None; 

     } 
    } 

我的事情,我必須停止使用首先從我的PictureBox的預覽,然後重新上傳。但我將如何做到這一點?我試過

pictureBox1.Image=null 

,但它沒有奏效。

+0

您需要檢查是否存在1.JPG如果是刪除它,然後將其保存沒有問題。 – Sorceri

+0

如果我將嘗試刪除它表示該文件已被其他進程使用。它只適用於我將重新運行我的項目。我認爲問題在這裏pictureBox2.Image = Image.FromFile(「C:\\ 1.jpg」); pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; – DIMITRIS

+0

您需要像Johan建議的那樣處理picturebox圖像:if(pictureBox2.Image!= null)pictureBox2.Image.Dispose(); – Sorceri

回答

2

當您使用

pictureBox2.Image = Image.FromFile("C:\\1.jpg"); 

靜態調用保持打開(並鎖定)文件。所以你不能覆蓋文件。

解決方案:

if (pictureBox2.Image != null) pictureBox2.Image.Dispose(); 
bitmap.Save("C:\\1.jpg"); 
bitmap.Dispose(); 
pictureBox2.Image = new Bitmap(Image.FromFile("C:\\1.jpg")); 

這樣的文件被釋放,並可以在以後被覆蓋。

一種替代方案:

if (pictureBox2.Image != null) pictureBox2.Image.Dispose(); 
bitmap.Save("C:\\1.jpg"); 
bitmap.Dispose(); 
using (Bitmap bm = new Bitmap(C:\\1.jpg")) 
{ 
    pictureBox2.Image = new Bitmap(bm); 
}; 
+0

相同的錯誤generela信息錯誤GDI +。我應該嘗試處理位圖嗎? – DIMITRIS

+0

我的不好:bitmap.Save(..)調用也鎖定文件,直到位圖被丟棄。編輯上面的解決方案...... 注:位圖保存到文件是一個非託管資源,所以即使您分配給位圖的新圖像(從SR),並不再有舊的位圖實例的引用,關聯的文件仍然保持打開狀態。處理位圖對象將釋放非託管資源(文件)。 –

+0

再次出現同樣的錯誤。問題出在這一行pictureBox2.Image = new Bitmap(Image.FromFile(「C:\\ 1.jpg」));.如果我將刪除此行其保存沒有任何問題保存新版本之前 – DIMITRIS

0

我解決了這個使用的FileStream。

Dim fs1 As System.IO.FileStream 
      fs1 = New System.IO.FileStream(Bitmap, IO.FileMode.Open, IO.FileAccess.Read) 
      PictureBox1.Image = System.Drawing.Image.FromStream(fs1) 
      fs1.Close() 

看你應該fs1.close()來完成流。

FileStream類表示在機器中的文件。 FileStream允許以字節數組的形式將數據移入或移出流。這意味着,它不會直接在文件中工作,就像您可以操作的Stream一樣。

的代碼是在vb.net(因爲它爲我的作品)。 所以會有將其轉換成C#