You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:20:58