C # Obtenir le nom de fichier des pièces jointes

J’ai une application C # simple qui envoie des courriels SMTP (à l’aide des classes System.Net.Mail). Après avoir envoyé (par courrier électronique) un object MailMessage, je souhaite parcourir la liste des pièces jointes et supprimer les fichiers d’origine associés à ces pièces jointes … propre collection de fichiers attachés. Il doit exister un bon moyen d’extraire le chemin de fichier complet de l’object attaché.

Je sais que cela doit être simple, mais je passe beaucoup trop de temps sur cette .. temps pour demander aux autres.

Vous pouvez

  • Lire Attachment.ContentStream
  • Si vous avez maintenant un StreamReader ou similaire, utilisez la propriété BaseStream pour essayer de trouver le FileStream interne
  • Lire FileStream.Name

mais gardez à l’esprit que le message électronique (et donc les pièces jointes et leurs stream) peut ne pas être collecté ou nettoyé immédiatement, de sorte que vous ne pourrez peut-être pas supprimer le fichier immédiatement. Vous feriez mieux de sous-classer Attachment et d’enregistrer le nom de fichier et la sous-classe Dispose (à exécuter après la suppression de la base) pour supprimer si vous avez vraiment besoin de procéder de cette façon.

Si vous ajoutez vos pièces jointes via le constructeur Attachment avec l’argument filePath , ces pièces jointes peuvent être récupérées via la propriété ContentStream et seront de type FileStream . Voici comment vous pouvez obtenir les noms des fichiers joints:

 var fileNames = message.Attachments .Select(a => a.ContentStream) .OfType() .Select(fs => fs.Name); 

Mais n’oubliez pas de disposer d’ MailMessage object MailMessage , sinon vous ne pourrez pas supprimer ces pièces jointes:

 IEnumerable attachments = null; using (var message = new MailMessage()) { ... attachments = message.Attachments .Select(a => a.ContentStream) .OfType() .Select(fs => fs.Name); } foreach (var attachment in attachments ) { File.Delete(attachment); } 

Il est généralement plus facile d’adopter une approche légèrement différente et de la joindre via un stream de mémoire plutôt qu’un fichier. Ainsi, vous évitez tous les problèmes liés à l’enregistrement des fichiers sur le disque et à leur nettoyage par la suite.

Court article ici à ce sujet.