C#中删除图片提示‘文件正在使用’问题求助
解决“文件正在使用”无法删除原图片的问题
嗨,我来帮你排查这个问题!你遇到的“文件正在使用”错误,核心原因是原图片文件被未正确释放的Image对象锁定了,咱们来拆解下问题出在哪:
看这段代码:
Image imgresize = Image.FromFile(fullpathb);//传入旧图片路径 imgresize = FixedSize(imgresize);//调整大小
你用Image.FromFile创建了一个Image实例并赋值给imgresize,但紧接着把imgresize重新赋值为FixedSize返回的新Bitmap对象——这就导致最初从FromFile创建的Image实例没有被Dispose,它一直占用着原图片文件,所以后续执行File.Delete时就会报错。
另外,Image.FromFile本身会在创建Image对象后持续锁定文件,直到该对象被Dispose,这也是新手很容易踩的坑。
下面给你两种可行的解决方案:
方案一:修复原代码的资源释放逻辑
确保每个创建的Image/Bitmap对象都被正确释放,尤其是最初从FromFile得到的实例:
// 单独保存原图片的引用,避免被覆盖后无法释放 Image originalImg = Image.FromFile(fullpathb); // 调用FixedSize处理图片,得到新实例 Image imgresize = FixedSize(originalImg); // 立即释放原图片实例,解除文件锁定 originalImg.Dispose(); // 保存处理后的新图片 imgresize.Save(fullpath, ImageFormat.Jpeg); // 释放处理后的图片资源 imgresize.Dispose(); // 现在可以正常删除原图片了 System.IO.File.Delete(fullpathb);
方案二:使用FileStream加载图片(更推荐)
用FileStream加载图片可以手动控制文件的打开模式,避免Image.FromFile的自动锁定问题,而且用using语句能自动帮我们释放资源,更安全简洁:
using (FileStream fs = new FileStream(fullpathb, FileMode.Open, FileAccess.Read)) { // 从FileStream加载图片,不会持续锁定文件 Image originalImg = Image.FromStream(fs); using (Image imgresize = FixedSize(originalImg)) { imgresize.Save(fullpath, ImageFormat.Jpeg); } } // FileStream和所有Image实例都已自动释放,文件不再被锁定 System.IO.File.Delete(fullpathb);
另外检查了你的FixedSize方法,里面的bmPhoto是返回给调用方的,调用方负责Dispose它的逻辑是对的,没问题。
内容的提问来源于stack exchange,提问作者Rafael Neokleous
相关产品推荐
相关产品推荐

