【问题标题】:IOException deleting files used attachments in MailMessageIOException 删除 MailMessage 中使用的附件的文件
【发布时间】:2011-03-25 21:12:02
【问题描述】:

我正在使用带有 .NET 4.0 的 Visual Studios 2010。

我正在将本地硬盘驱动器中的文件附加到 MailMessage(即MailMessage.Attachements.Add(Attachment))。执行SmtpClient.Send(MailMessage) 命令后,我遍历附件路径并执行File.Delete(string path)。但是,我立即得到一个@ 987654324@.

System.IO.IOException:进程无法访问文件“c:\temp\test.docx”,因为它正被另一个进程使用。 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) 在 System.IO.File.Delete(字符串路径) ...

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

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

【问题讨论】:

    标签: c# email attachment


    【解决方案1】:

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

    我建议将新附件对象的创建包含在 using 语句中,以确保在尝试删除文件之前正确处理。

    【讨论】:

    • 另外,MailMessage 应该被处理掉。
    • using 语句如何处理多个附件?如果它是一个附件,那是有道理的,但是对于每个 MailMessage 的多个附件,我不知道它是如何工作的。可以举个例子吗?
    • @user373312 - 每个附件都将打开一个新流,因此您需要将每个附件包含在 using 语句中。这最好通过将附件的添加包装在自己的方法中来实现。
    • 关于您的第一点,这正是我的问题:如何确保流关闭?
    • @user373312 - 这就是using 语句的作用。它在被更新的对象周围实现了 Dispose 模式。
    【解决方案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();
            }
    

    【讨论】:

      【解决方案3】:

      尝试改用SendAsync()。它在完成时有一个回调。在回调中,删除您的文件。

      回调是SMPTClient 类上的client.SendCompleted

      如果不出意外,它可能会为正在发生的事情提供线索。

      【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2011-07-18
      • 1970-01-01
      • 2011-07-17
      相关资源
      最近更新 更多