IOException删除MailMessage中使用附件的文件

时间:2011-03-25 21:12:03

标签: c# email attachment

我正在使用Visual Studio 2010和.NET 4.0。

我将文件从本地硬盘附加到MailMessage(即MailMessage.Attachements.Add(Attachment))。执行SmtpClient.Send(MailMessage)命令后,我遍历附件路径并执行File.Delete(string path)。 ,我立即得到System.IO.IOException

  

System.IO.IOException:进程无法访问文件'c:\ temp \ test.docx',因为它正由另一个进程使用。      在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)      在System.IO.File.Delete(字符串路径)      ...

我想也许我无法删除大文件,因为它在SmtpClient.Send命令期间仍在流式传输。但是,这似乎适用于所有大小的文件(2 KB到8 MB)。有人可以澄清一下发生了什么吗?

在发出File.Delete调用之前,有没有办法确保SmtpClient.Send调用完成(它已完全发送带有附件的电子邮件并释放文件/附件上的所有锁)?

3 个答案:

答案 0 :(得分:2)

在删除附件流之前,应确保关闭附件流的流。

我建议在using语句中包装新附件对象的创建,以确保在尝试删除文件之前进行适当的处​​理。

答案 1 :(得分:2)

在更好的迟到而不是类别的情况下归档:我有同样的问题,并且能够通过在发送消息后在MailMessage实例上调用Dispose()方法来解决它,如下所示:

        try
        {
            MailMessage msg = new MailMessage();
            msg.To.Add(input.To);
            msg.From = new MailAddress(input.From);
            msg.Subject = input.Subject;
            msg.Body = input.Message;
            Attachment att = new Attachment(reportPath);
            msg.Attachments.Add(att);

            SmtpClient client = new SmtpClient(serverAddress, serverPort);
            client.Credentials = creds;
            client.EnableSsl = true;
            client.Send(msg);
            msg.Dispose();
        }

答案 2 :(得分:0)

请尝试使用SendAsync()。它完成后会有一个回调。在回调中,删除文件。

client.SendCompleted类的回调为SMPTClient

如果不出意外,它可能会给出发生了什么的线索。