2011-05-06 3 views
7

J'ai une application C# simple qui envoie des emails SMTP (en utilisant les classes System.Net.Mail). Après avoir envoyé (envoyer un email) un objet MailMessage, je veux parcourir la liste des pièces jointes et supprimer les fichiers d'origine associés à ces pièces jointes ... mais j'ai du mal à trouver le chemin complet associé à chaque pièce jointe - sans garder mes propre collection de chemins de fichiers de pièces jointes. Il doit y avoir un bon moyen d'extraire le chemin complet du fichier à partir de l'objet de pièce jointe.C# Obtenir le nom de fichier des pièces jointes

Je sais que cela doit être simple, mais je passe beaucoup trop de temps à ce sujet ... le temps de demander aux autres.

+0

Comment transmettez-vous le fichier en pièce jointe? Je ne peux pas voir un [constructeur Attachment] (http://msdn.microsoft.com/en-us/library/system.net.mail.attachment.attachment.aspx) qui accepte un nom de fichier directement. Passez-vous dans FileStreams? Pourquoi pensez-vous que l'objet Attachement aura toujours le nom de fichier source? – Rup

+0

@Rup Le constructeur est décrit ici: http://msdn.microsoft.com/fr-fr/library/ms144614.aspx. Mais je ne pense pas que l'objet 'Attachment' conserve le nom du fichier. –

+0

@Joel Ah, OK - Je pensais que juste définir le nom de fichier MIME pas lu le fichier. Dans ce cas, ma réponse ci-dessous fonctionnera: cela ne sauvegarde pas le nom de fichier dans la classe de pièce jointe mais sa pièce jointe avec un FileStream afin que vous puissiez lire le nom du flux. – Rup

Répondre

2

Vous pouvez

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

+1

Votre lien vers 'Attachment.ContentStream' manque un" x "à la fin. (devrait être le fichier .aspx.) Je l'éditerais pour toi, mais n'ai pas encore assez de représentant. –

1

Il est généralement plus facile de prendre une amure légèrement différente et de l'attacher via un flux de mémoire plutôt qu'un fichier. De cette façon, vous évitez tous les problèmes liés à l'enregistrement des fichiers sur le disque et à leur nettoyage par la suite.

Short article here on that.

+0

Si c'est un fichier temporaire que vous avez généré vous-même, vous pouvez définir FileOptions.DeleteOnClose et quitter le système d'exploitation pour le nettoyer de toute façon. – Rup

6

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

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

Mais ne pas oublier de disposer d'abord MailMessage objet, sinon vous ne pourrez pas supprimer ces pièces jointes:

IEnumerable<string> attachments = null; 
using (var message = new MailMessage()) 
{ 
    ... 
    attachments = message.Attachments 
     .Select(a => a.ContentStream) 
     .OfType<FileStream>() 
     .Select(fs => fs.Name); 
} 

foreach (var attachment in attachments) 
{ 
    File.Delete(attachment); 
} 
+0

En raison de l'exemple de code, votre réponse a été la plus utile, mais Rup a eu la même idée, et il était le premier, alors je lui ai donné la bonne réponse ... mais vous avez eu un vote. – Clinemi

Questions connexes