2011-05-06 58 views
7

我有一個簡單的C#應用​​程序發送SMTP電子郵件(使用System.Net.Mail類)。在發送MailMessage對象之後,我想遍歷附件列表並刪除與這些附件關聯的原始文件......但我很難找到與每個附件關聯的完整文件路徑 - 而不保留我的自己的附件文件路徑的集合。必須有從附件對象中提取完整文件路徑的好方法。C#從郵件附件獲取文件名

我知道這一定很簡單,但我花了很多時間在這個時間去問別人。

+0

如何你是否以附件形式傳遞文件?我看不到直接接受文件名的[Attachment constructor](http://msdn.microsoft.com/zh-cn/library/system.net.mail.attachment.attachment.aspx)。你在傳遞FileStreams嗎?你爲什麼認爲Attachement對象仍然有源文件名? – Rup 2011-05-06 14:21:23

+0

@Rup構造函數在這裏描述:http://msdn.microsoft.com/en-us/library/ms144614.aspx。但我不認爲'Attachment'對象保留了文件名。 – 2011-05-06 14:32:08

+0

@Joel Ah,好 - 我以爲只是設置MIME文件名不讀取文件。在這種情況下,我的答案將起作用:它不會將附件中的文件名保存到類中,而是通過FileStream插入到附件中,以便您可以從流中讀取名稱。 – Rup 2011-05-06 14:39:31

回答

2

您可以

,但請記住郵件信息(以及附件和它們的流)可能無法立即收集或清理,因此您可能無法立即刪除文件。如果你真的需要這樣做,你可以做更好的子類化附件,並記錄文件名和子類Dispose(在基本配置之後執行)來執行刪除操作。

+1

您到'Attachment.ContentStream'的鏈接最後缺少一個「x」。 (應該是.aspx文件。)我會爲你編輯它,但還沒有足夠的代表。 – 2011-05-06 17:37:52

1

通常情況下最簡單的方法是通過內存流而不是文件進行略微不同的粘連。這樣可以避免將文件保存到磁盤並在之後進行清理的所有問題。

Short article here on that.

+0

如果它是您自己生成的臨時文件,那麼您可以設置FileOptions.DeleteOnClose,然後讓操作系統清理它。 – Rup 2011-05-06 14:28:41

6

如果通過Attachment構造與filePath參數加入您的附件,這些附件可以通過ContentStream財產取回,並將於FileStream類型。這裏是你如何能得到的文件的文件名附:

var fileNames = message.Attachments 
    .Select(a => a.ContentStream) 
    .OfType<FileStream>() 
    .Select(fs => fs.Name); 

但是不要忘了先處理MailMessage對象,否則您將無法刪除這些附件:

IEnumerable<string> attachments = null; 
using (var message = new MailMessage()) 
{ 
    ... 
    attachments = message.Attachments 
     .Select(a => a.ContentStream) 
     .OfType<FileStream>() 
     .Select(fs => fs.Name); 
} 

foreach (var attachment in attachments) 
{ 
    File.Delete(attachment); 
} 
+0

因爲代碼示例,你的迴應是最有幫助的,但Rup有同樣的想法,而且他是第一個,所以我給了他正確的迴應......但你得到了一票。 – Clinemi 2011-05-06 19:15:23