2010-05-18 6 views
14

j'utilise System.Net.Mail pour l'envoi de courrier en asp.net .. comment supprimer le fichier joint après qu'il est envoyé comme courrier pièce jointe .. i essayé d'utiliser la méthode File.Delete .. mais Je reçois cette erreur .. le processus ne peut pas accéder au chemin du fichier \ fun.jpg 'parce qu'il est utilisé par un autre processus. mercifichier pièce jointe suppression

Répondre

26

Éliminer le MailMessage lorsque vous avez terminé avec elle. Il a toujours un verrou sur le fichier que vous avez ajouté en pièce jointe jusqu'à ce que vous l'ayez fait.

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

Sortie: Faux

Je suppose que si vous avez encore quelque chose de verrouillage du fichier après avoir disposé le message, que vous avez probablement un autre verrou sur le fichier, mais sans code, nous ne pouvons pas aider toi.

1

Vous ne pouvez pas supprimer un fichier joint après avoir envoyé le mail.Avant d'envoyer, vous pouvez supprimer.

Ce que l'erreur dit, le chemin que vous avez mentionné utilise un autre processus. Notez que nous avons créé la pièce jointe à partir de MemoryStream et que nous avons nommé la pièce jointe comme nous le souhaitons. Le nom de la pièce jointe dans le deuxième paramètre est le nom du fichier dans l'e-mail, pas le nom sur le disque dur du système local. En fait, la pièce jointe ne va jamais sur le disque dur local. Le troisième paramètre est le type Mime de la pièce jointe, dans notre cas c'est du texte.

Edit: use Dispose() the mail

+0

je pense que vous devez disposer les objets d'attachement. – anishMarokey

0

L'extension de la classe MailMessage est une bonne façon de résoudre cela et réduire les chances de courir ce problème encore ...

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

... et rappelez-vous d'utiliser avec une construction « en utilisant » (qui vous devriez utiliser quand même) ...

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

Vous devez juste jeter l'objet message avant de supprimer le fichier. Par exemple:

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

Si votre courrier ont beaucoup Accessoires

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

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

//delete file