2010-05-18 8 views
14

ich benutze System.Net.Mail für das Senden von Mail in asp.net .. wie Anlage Datei löschen, nachdem es als Anhang Mail gesendet wird .. Ich habe versucht, File.Delete-Methode zu verwenden .. aber Ich bekomme diesen Fehler .. der Prozess kann nicht auf die Datei Pfad \ fun.jpg zugreifen, weil es von einem anderen Prozess verwendet wird. dankeAnlage Datei löschen

Antwort

26

Entsorgen Sie das Mailmessage, wenn Sie mit ihm fertig sind. Es hat immer noch eine Sperre für die Datei, die Sie als Anhang hinzugefügt haben, bis Sie dies getan haben.

var filePath = "C:\\path\\to\\file.txt"; 
var smtpClient = new SmtpClient("mailhost"); 
using (var message = new MailMessage()) 
{ 
    message.To.Add("[email protected]"); 
    message.From = new MailAddress("[email protected]"); 
    message.Subject = "Test"; 
    message.SubjectEncoding = Encoding.UTF8; 
    message.Body = "Test " + DateTime.Now; 
    message.Attachments.Add(new Attachment(filePath)); 
} 
if (File.Exists(filePath)) File.Delete(filePath); 
Console.WriteLine(File.Exists(filePath)); 

Ausgabe: False

Ich könnte mir vorstellen, dass, wenn Sie noch etwas Sperren der Datei haben, nachdem die Nachricht entsorgen, dass Sie wahrscheinlich eine andere Sperre auf die Datei haben, aber ohne Code, können wir nicht helfen Sie.

1

Sie können eine angehängte Datei nach dem Senden der Mail nicht löschen. Vor dem Senden können Sie löschen.

Der Fehler besagt, dass der von Ihnen erwähnte Pfad einen anderen Prozess verwendet.

Beachten Sie, dass wir den Anhang aus dem MemoryStream erstellt haben und wir den Anhang benennen können, was wir wollen. Der Name des Anhangs im zweiten Parameter ist der Name der Datei in der E-Mail, nicht der Name auf der lokalen Systemfestplatte. Tatsächlich geht der Anhang niemals auf die lokale Festplatte. Der dritte Parameter ist der Mime-Typ des Anhangs, in unserem Fall ist dies Text.

Edit: use Dispose() the mail

+0

Ich glaube, Sie die Befestigungs Objekte entsorgen müssen. – anishMarokey

0

die Mailmessage-Klasse erweitern ist ein guter Weg, dies zu lösen und die Chancen des Laufens in dieses Problem wieder zu reduzieren ...

class MyMailMessage : MailMessage, IDisposable 
{ 
    private List<string> _tempFiles = new List<string>(); 

    public void Attach(string filename) 
    { 
     base.Attachments.Add(new Attachment(filename)); 
     this._tempFiles.add(filename); 
    } 

    new public void Dispose() 
    { 
     base.Dispose(); 
     this._tempFiles.Foreach(x => File.Delete(x)); 
    } 
} 

... und erinnern mit einem ‚mit‘ Konstrukt zu verwenden (die sollten Sie trotzdem verwenden) ...

using(SmtpClient client = GetMySmtpClient()) 
using(MyMailMessage msd = new MyMailMessage()) 
{ 
    msg.Attach(filename); 
    client.send(msg); 
} 
0

Sie müssen nur das Nachrichtenobjekt entsorgen, bevor Sie die Datei löschen. Z. B:

Dim message As New MailMessage 
    message.From = New MailAddress(fromEmail, fromName) 
    message.Subject = subject 
    message.CC.Add(toCCEmail) 
    message.Bcc.Add(toBCCEmail) 
    Dim attach As Attachment = New Attachment(attachmentPath) 
    message.Attachments.Add(attach) 
    message.IsBodyHtml = True 
    message.Body = body 
    mailClient.Send(message) 

    message.Dispose() 'Add this line to dispose the message! 
0

Wenn Ihr Mail-Anhänge Lose haben

List<Attachments> lstAtt = new List<Attachments>(); 
Attachment att = new Attachment(file); 
lstAtt.Add(att); 

//finally 
foreach(var a in lstAtt) 
{ 
    a.Dispose(); 
} 

//delete file