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

C#删除文件失败提示被其他进程占用,代码问题排查求助

问题分析与解决办法

嘿,我一眼就瞅出问题所在啦!你代码里的Attachment对象没被正确释放,导致文件一直被邮件相关的进程占着,所以后面删文件的时候就会弹出“被其他进程占用”的错误~

核心原因

Attachment、MailMessage这类对象都实现了IDisposable接口,它们在使用时会打开文件句柄来读取内容。如果不用using语句包裹或者手动调用Dispose()方法,.NET的垃圾回收机制不会立刻回收这些资源,文件句柄就会一直被占用着,自然删不了文件。你现在只给StreamReader加了using,但MailMessage和Attachment都没处理,这就是关键漏洞!

修正后的代码示例

string filename = "C:/File/testExport_1234.pdf";
string htmlfile = "C:/file/1234.html";

// 给MailMessage也加上using,链式写法更简洁
using (StreamReader reader = new StreamReader(htmlfile))
using (MailMessage message = new MailMessage(emailFrom, emailTo, emailSubject, reader.ReadToEnd()))
{
    message.IsBodyHtml = true;
    
    // 把Attachment放进using块,确保用完就释放文件句柄
    using (Attachment data = new Attachment(filename, MediaTypeNames.Application.Octet))
    {
        data.Name = "你的自定义文件名.pdf"; // 补全你之前未写完的代码
        message.Attachments.Add(data);
        
        // 发送邮件的SmtpClient也建议用using包裹,避免资源泄漏
        using (SmtpClient smtpClient = new SmtpClient("你的SMTP服务器地址"))
        {
            // 可以根据需要设置SMTP的端口、凭据等
            // smtpClient.Port = 587;
            // smtpClient.Credentials = new NetworkCredential("账号", "密码");
            smtpClient.Send(message);
        }
    }
}

// 现在再执行删除操作就不会报错啦
File.Delete(filename);

额外注意事项

  • 所有实现IDisposable的类,都尽量用using语句包裹,它会自动在代码块结束时调用Dispose(),帮你释放包括文件句柄在内的各种资源。
  • 如果代码里还有其他地方用到这个PDF文件,也要检查那些地方有没有正确关闭文件流或释放相关对象。
  • 虽然Windows文件系统不区分大小写,但路径里的大小写尽量保持一致,避免一些奇怪的隐性问题。

内容的提问来源于stack exchange,提问作者sigmax bpo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:38