2011-03-25 26 views
0

我使用Visual Studio 2010與.NET 4.0。IOException在MailMessage中刪除使用的附件中的文件

我附上我的本地硬盤文件到MAILMESSAGE(即MailMessage.Attachements.Add(Attachment))。之後我執行SmtpClient.Send(MailMessage)命令,我遍歷安裝路徑和執行File.Delete(string path)。不過,我立即得到一個System.IO.IOException

System.IO.IOException:進程無法訪問文件'c:\ temp \ test.docx',因爲它正在被另一個進程使用 at System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath) at System.IO.File.Delete(String path) ...

我想我可能無法刪除大文件,因爲它在SmtpClient.Send命令期間仍然在流式傳輸。然而,這看起來發生在所有大小的文件(2 KB到8 MB)上。有人可以澄清發生了什麼事嗎?

有沒有辦法確保SmtpClient.Send調用完成(它已完全發送附件中的電子郵件並在文件/附件上發佈所有鎖),然後再發出File.Delete調用?

回答

2

在刪除附件之前,應確保附件流已關閉。

我建議在using聲明中包裝新附件對象的創建,以確保在嘗試刪除文件之前正確處置。

+1

另外,MailMessage應該被丟棄。 – 2011-03-25 21:22:47

+0

@FrantišekŽiačik - 好點。 – Oded 2011-03-25 21:33:23

+0

using語句對多個附件的工作方式如何?如果它是一個附件,這是有道理的,但對於每個MailMessage的多個附件,我不知道如何工作。你能舉個例子嗎? – jake 2011-03-25 21:36:43

0

請嘗試使用SendAsync()來代替。它在完成時有回調。在回調中,刪除你的文件。

SMPTClient類的回調是client.SendCompleted

如果沒有別的,它可能會給出線索。

+0

我跟隨你的領導和參考http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx。當我使用SmtpClient.SendAsync時,我的電子郵件都沒有發送過。 – jake 2011-03-25 21:39:03

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(); 
     }