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

简介:   Image.FromFile使用比较让人抓狂的问题。     Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等操作).

 

Image.FromFile使用比较让人抓狂的问题。11.gif

  


  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();

呃.就这样了.

相关文章
|
4月前
|
人工智能 数据库
无法将文件“obj\Debug\UI.exe“复制到“bin\Debug\UI.exe“。文件“bin\Debug\UI.exe“正由另一个进程使用,因此该进程无法访问此文件。
无法将文件“obj\Debug\UI.exe“复制到“bin\Debug\UI.exe“。文件“bin\Debug\UI.exe“正由另一个进程使用,因此该进程无法访问此文件。
75 0
|
3月前
|
Arthas 测试技术
错误提示表明Arthas无法打开目标进程的socket文件
错误提示表明Arthas无法打开目标进程的socket文件
51 2
|
5月前
|
安全 网络安全 开发工具
如何修改/etc/security/limits.conf 一个进程能打开的最大文件数 1024 为 自己期望的数字
如何修改/etc/security/limits.conf 一个进程能打开的最大文件数 1024 为 自己期望的数字
|
5月前
|
Windows
卸载应用后,删除安装根目录下的所有文件,提示已在另一进程打开,在资源管理器进程中找不到该程序的解决
卸载应用后,删除安装根目录下的所有文件,提示已在另一进程打开,在资源管理器进程中找不到该程序的解决
44 0
|
Linux 开发工具
Linux 多个vi、vim进程编辑同一文件时的临时文件问题
Linux 多个vi、vim进程编辑同一文件时的临时文件问题
230 0
|
9月前
|
开发框架 .NET
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
|
Java 编译器 开发工具
MissingPropertyException apk过大,打包后在apk出现不相关资源文件 另一个程序正在使用此文件 进程无法访问 NDK can not
MissingPropertyException apk过大,打包后在apk出现不相关资源文件 另一个程序正在使用此文件 进程无法访问 NDK can not
204 0
MissingPropertyException apk过大,打包后在apk出现不相关资源文件 另一个程序正在使用此文件 进程无法访问 NDK can not
|
11月前
|
Linux Shell C++
【Linux初阶】进程程序替换 | 初识、原理、函数、应用 & makefile工具的多文件编译
替换初识,替换原理,替换函数理解和使用,makefile工具的多文件编译,进程替换应用(简易命令行实现)
105 0
【Linux初阶】进程程序替换 | 初识、原理、函数、应用 & makefile工具的多文件编译
|
11月前
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问
455 0

相关实验场景

更多