Image.FromFile引发的文件正由另一进程使用,因此该进程无法访问该文件

Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被

解锁前无法对图像进行操作(比如删除,修改等操作).

 

一、实际使用过程中出现的血案及破案过程:

  

(1) 血案现场

  想删除图片文件时,出现下面的异常信息:

 

   “System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件”

 

(2)出问题的主要代码段:

 

image

                                          图1

有问题的调用方法,点击某一行的事件:

 

  1. dataGridView1_MouseClick()
  2. {
  3. ..
    1. //
    2. //  一调用Image.FromFile, FileSourcePath对应的图片文件会锁定,不能再进行删除等操作
    3. //
  4.   pictureBox1.Image = System.Drawing.Image.FromFile(FileSourcePath);
  5.   pictureBox1.Visible = true;
  6. ..
  7. }

 

 

image

                                           图2

 

图片被锁定后,这里若再点击 Delete按钮,触发click事件如下,就会报错!

 

  1. DeletePic_Click()
  2. {
  3. //
  4. // 这里是利用 FileInfo来删除文件
  5. //
  6. FileInfo FInfo = new FileInfo(@AbsolutePath);
  7.                            FInfo.Delete();
  8. }

 

 执行完DeletePic_Click()函数马上报错,触发血案:

“System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件”

 
 

(3)破解血案的方法

  使用二中提到的方法三,稍加修改后的函数

 

  1. dataGridView1_MouseClick()
  2. {
  3. .
  4. //
  5. // 通过生成clone的方式,使用clone来赋值,从而 FileSourcePath对应的图片得到解锁
  6. //
  7. System.Drawing.Image img = System.Drawing.Image.FromFile(FileSourcePath);
  8. System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
  9. img.Dispose();
 
  1. pictureBox1.Image = bmp; // System.Drawing.Image.FromFile(FileSourcePath);
  2. pictureBox1.Visible = true;
  3. .
  4. }

成功破案!

 

二、原贴地址:

 

http://www.cnblogs.com/nicch/archive/2008/03/08/1096818.html

  向原作者致敬! 

  .NET中的 Image.FromFile  一旦使用后,对应的文件在一直调用 其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等操作).

 

在以前用的过程中曾用过下面三个方法解决问题.

 

  1. 第一种方法,在要进行文件操作前将Image对象销毁.
  2. PictureBox picbox;
  3. if(picbox.Image!=null)picbox.Image.Disponse();
  4.  
  5. 第二种方法,就是在加载图像的时候用一种方法替代:
  6.  
  7. System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
  8. System.Drawing.Image bmp = new System.Drawing.Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  9. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
  10. g.DrawImage(img, 0, 0);
  11. g.Flush();
  12. g.Dispose();
  13. img.Dispose();
  14. //下面开始使用bmp作为显示的Image对象
  15.  
  16. 一直以来用的是上面的第二种方法.今天实验出来突然有种方法更加简单:
  17.  
  18. System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
  19. System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
  20. img.Dispose();


posted @ 2014-03-15 12:02  Net-Spider  阅读(577)  评论(0)    收藏  举报