2017-07-18 5 views
0

Verzeihen Sie meine Neuheit in den Klassen MailMessage und SmtpClient. Ich habe etwas gebaut, das grundsätzlich funktioniert, aber wenn ich mich darauf vorbereite, die Anhänge zu senden, kopiere ich die Anhänge manchmal in den Speicherort der temporären Dateien (Path.GetTempPath() + @"\" + timestampWithFF), weil sie manchmal zum Versenden gezippt werden müssen. Wenn dies passiert, möchte ich sicherstellen, dass ich die Dateien nach dem Senden lösche (vor allem, weil alles dort relativ groß sein wird).MailMessage Löschen Sie Anhänge nach dem Senden, wenn in Path.GetTempPath()

Zweifache Frage: 1. sollte ich nicht mit der Bereinigung der Dateien kümmern, weil das Betriebssystem (Win7) einen guten Job machen wird? 2. Wie kann ich die Festplattenposition der Attachments in client.SendCompleted bekommen?

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

Ich sehe, ich a.Dispose() verwenden könnte, aber ich habe keine Ahnung, was es tut ... Ich vermute, dass es von dem Objekt angeordnet wird (was msg.Dispose sowieso als nächstes tun würde), würde aber die Dateien führen auf die Festplatte.

muss ich die Dateipfade der Anhänge separat senden? Die client.SendCompleted() Zeile ist in: sendMailAsync(SmtpClient client, MailMessage msg) Methode. Ich konnte dies ändern: sendMailAsync(SmtpClient client, MailMessage msg, List<string> attachments) und fügen Sie diese in die SendCompleted(), aber es fühlt sich ein bisschen klobig:

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

Antwort

2
  1. sollte ich nicht mit Aufräumen die Dateien stören, da das OS (win7) tun eine gute Arbeit davon?

Wenn ich Sie wäre, würde ich immer noch die temporäre Datei löschen, obwohl OS reinigen würde, wenn es für notwendig erachtet

  1. wie kann ich der HDD-Speicherort der Anhänge in client.SendCompleted?

Die Dateien in den Anlagen können durch ContentStream abgerufen werden. Ihr Typ wäre 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); 
     } 

    } 
}; 

Hinweis: zuerst das msg Objekt verfügt und tut dann das Löschen

+0

hmmm ... dies zu Recht so nah scheint, aber ich bin immer Null-Elemente aus dem Select. Ich denke, es erforderte ein .ToArray() (oder ähnlich) nach Auswahl (fs => fs.Name), weil ansonsten Dateiattachments nicht nach msg.Dispose ausgewertet wird, also gibt es nichts zu durchlaufen. – Keith

+0

Sorry mein schlechtes. Ich schrieb es aus meinem Kopf und erinnerte mich an die alten Tage, an denen ich daran gearbeitet hatte und total vermisst '.ToArray();'. Danke für die Bearbeitung! :) hoffe, das hat sich nach dem Hinzufügen von 'ToArray' bewährt –

Verwandte Themen