我正在使用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
调用完成(它已完全发送带有附件的电子邮件并释放文件/附件上的所有锁)?
答案 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
。
如果不出意外,它可能会给出发生了什么的线索。