Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12393025
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: 服务器与存储

2012-06-26 17:58:53

 

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. System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
  6. System.Drawing.Image bmp = new System.Drawing.Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
  7. System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
  8. g.DrawImage(img, 0, 0);
  9. g.Flush();
  10. g.Dispose();
  11. img.Dispose();
  12. //下面开始使用bmp作为显示的Image对象

  13. 一直以来用的是上面的第二种方法.今天实验出来突然有种方法更加简单:

  14. System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
  15. System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
  16. img.Dispose();

呃.就这样了.

阅读(7386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~