Image.FromFile使用比较让人抓狂的问题。
Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被
解锁前无法对图像进行操作(比如删除,修改等操作).
一、实际使用过程中出现的血案及破案过程:
(1) 血案现场
想删除图片文件时,出现下面的异常信息:
“System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件”
(2)出问题的主要代码段:
图1
有问题的调用方法,点击某一行的事件:
- dataGridView1_MouseClick()
- {
- ..
- //
- // 一调用Image.FromFile, FileSourcePath对应的图片文件会锁定,不能再进行删除等操作
- //
- pictureBox1.Image = System.Drawing.Image.FromFile(FileSourcePath);
- pictureBox1.Visible = true;
- ..
- }
图2
图片被锁定后,这里若再点击 Delete按钮,触发click事件如下,就会报错!
- DeletePic_Click()
- {
- //
- // 这里是利用
FileInfo来删除文件
- //
- FileInfo FInfo = new FileInfo(@AbsolutePath);
- FInfo.Delete();
- }
执行完DeletePic_Click()函数马上报错,触发血案:
“System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件”
(3)破解血案的方法
使用二中提到的方法三,稍加修改后的函数
- dataGridView1_MouseClick()
- {
- .
- //
- // 通过生成clone的方式,使用clone来赋值,从而
FileSourcePath对应的图片得到解锁
- //
- System.Drawing.Image img = System.Drawing.Image.FromFile(FileSourcePath);
- System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
- img.Dispose();
- pictureBox1.Image = bmp; // System.Drawing.Image.FromFile(FileSourcePath);
- pictureBox1.Visible = true;
- .
- }
成功破案!
二、原贴地址:
http://www.cnblogs.com/nicch/archive/2008/03/08/1096818.html
向原作者致敬!
.NET中的 Image.FromFile 一旦使用后,对应的文件在一直调用 其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等操作).
在以前用的过程中曾用过下面三个方法解决问题.
- 第一种方法,在要进行文件操作前将Image对象销毁.
- PictureBox picbox;
- if(picbox.Image!=null)picbox.Image.Disponse();
- 第二种方法,就是在加载图像的时候用一种方法替代:
- System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
- System.Drawing.Image bmp = new System.Drawing.Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
- g.DrawImage(img, 0, 0);
- g.Flush();
- g.Dispose();
- img.Dispose();
- //下面开始使用bmp作为显示的Image对象
- 一直以来用的是上面的第二种方法.今天实验出来突然有种方法更加简单:
- System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
- System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
- img.Dispose();
呃.就这样了.
阅读(7500) | 评论(0) | 转发(0) |