supprimer le fichier joint

J’utilise System.Net.Mail pour l’envoi de courrier en asp.net .. comment supprimer le fichier joint après l’avoir envoyé en tant que pièce jointe .. j’ai 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 ‘car il est utilisé par un autre processus. Je vous remercie

Éliminez le MailMessage lorsque vous avez terminé. Le fichier que vous avez ajouté en tant que pièce jointe rest verrouillé 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

J’imagine que si vous avez encore quelque chose de verrouillé après la suppression du message, vous avez probablement un autre verrou sur le fichier, mais sans code, nous ne pouvons pas vous aider.

Vous ne pouvez pas supprimer un fichier joint après avoir envoyé le courrier. Avant de l’envoyer, vous pouvez le supprimer.

Ce que l’erreur dit, le chemin que vous avez mentionné utilise un autre processus.

 MailMessage Message = new MailMessage(); Message.Subject = "Attachment Test"; Message.Body = "Check out the attachment!"; Message.To.Add("[email protected]"); Message.From = "[email protected]"; Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text)); 

Notez que nous avons créé la pièce jointe à partir de MemoryStream et que nous devons nommer la pièce jointe comme vous le souhaitez. 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 au disque dur local. Le troisième paramètre est le type Mime de la pièce jointe, dans notre cas, il s’agit de texte.

Edit: use Dispose() the mail

L’extension de la classe MailMessage est un bon moyen de résoudre ce problème et de réduire les risques de rencontrer à nouveau ce problème …

 class MyMailMessage : MailMessage, IDisposable { private List _tempFiles = new List(); public void Attach(ssortingng 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 n’oubliez pas d’utiliser une construction ‘using’ (que vous devriez utiliser de toute façon) …

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

Il vous suffit de disposer de l’object 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! 

Si votre courrier a beaucoup de pièces jointes

 List lstAtt = new List(); Attachment att = new Attachment(file); lstAtt.Add(att); //finally foreach(var a in lstAtt) { a.Dispose(); } //delete file