MailMessage发送后删除附件,如果在Path.GetTempPath()

问题描述:

请原谅我对MailMessage和SmtpClient类的新意。我已经构建了一些基本上可行的东西,但在准备发送附件时,我有时会将附件复制到临时文件位置(Path.GetTempPath() + @"\" + timestampWithFF),因为它们有时必须压缩才能发送。发生这种情况时,我想确保在发送后删除那些文件(特别是因为任何事情会相对较大)。MailMessage发送后删除附件,如果在Path.GetTempPath()

双重问题: 1.我应该不打扰清理文件,因为操作系统(win7)会做得很好吗? 2.如何获得附件中的HDD位置client.SendCompleted

client.SendCompleted += (s, e) => 
{ 
    client.Dispose(); 
    foreach(Attachment a in msg.Attachments) 
    { 
     // want to actually delete the file from the HDD if it's in Path.GetTempPath(); 
    } 
    msg.Dispose(); 
}; 

我看我可以使用a.Dispose(),但我没有任何想法它做什么...我怀疑这是处置的对象(其中msg.Dispose会做下一个反正),但将在保留原文件HDD。

我必须分别发送附件的文件路径吗? client.SendCompleted()行在: sendMailAsync(SmtpClient client, MailMessage msg)方法。我可以将其更改为: sendMailAsync(SmtpClient client, MailMessage msg, List<string> attachments) ,这增加了SendCompleted(),但感觉有点笨重:

string tempDir = Path.GetTempPath(); 
foreach(string f in attachments) 
{ 
    if(f.Contains(tempDir)) // want to actually delete the file from the HDD if it's in Path.GetTempPath(); 
    { 
     if (File.Exists(f)) { File.Delete(f); } 
    } 
} 

  1. 我不应该与清理文件,因为操作系统(WIN7)会做烦它的好工作?

如果我是你,我仍然会删除临时文件,尽管操作系统将清理它,认为必要时

  1. 我怎样才能客户端中的附件的HDD位置。发送完成?
开始=“2”>

附件中的文件可以通过ContentStream检索。他们的类型将是FileStream

client.SendCompleted += (s, e) => 
{ 
    client.Dispose(); 
    var fileattachments = msg.Attachments 
          .Select(x => x.ContentStream) 
          .OfType<FileStream>() 
          .Select(fs => fs.Name) 
          .ToArray(); 

    msg.Dispose(); 

    string tempPath = Path.GetTempPath(); 
    foreach (var attachment in fileattachments) 
    { 
     if(attachment.Contains(tempPath) 
     { 
      File.Delete(attachment); 
     } 

    } 
}; 

注:首先处置msg对象,然后做删除

+0

嗯...这似乎如此接近正确的,但我发现从选择零个元素。我认为在Select(fs => fs.Name)之后需要一个.ToArray()(或类似的),因为否则fileattachments不会在msg.Dispose之后被评估,所以没有什么可以循环。 – Keith

+0

对不起我的坏。我从头脑中写下来,回忆起我过去的那些日子,完全错过了'.ToArray();'。感谢编辑! :)希望在添加'ToArray'之后,你就能解决这个问题 –