C # Получить имя файла из почтовых вложений - PullRequest
8 голосов
/ 06 мая 2011

У меня есть простое приложение на C #, которое отправляет SMTP-письма (используя классы System.Net.Mail). После отправки (отправки по электронной почте) объекта MailMessage я хочу перебрать список вложений и удалить исходные файлы, связанные с этими вложениями ... но мне трудно найти полный путь к файлу, связанный с каждым вложением, - не сохраняя свой собственная коллекция путей к файлам вложений. Должен быть хороший способ извлечь полный путь к файлу из объекта вложения.

Я знаю, что это должно быть просто, но я трачу много времени на это .. время, чтобы спросить других.

Ответы [ 3 ]

8 голосов
/ 06 мая 2011

Если вы добавляете свои вложения через конструктор Attachment с аргументом filePath, эти вложения могут быть получены через свойство ContentStream и будут иметь тип FileStream.Вот как вы можете получить имена файлов вложенных файлов:

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

Но не забудьте сначала удалить объект MailMessage, иначе вы не сможете удалить эти вложения:

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);
}
3 голосов
/ 06 мая 2011

Вы можете

  • Чтение Attachment.ContentStream
  • Если у вас теперь есть StreamReader или аналогичный, используйте свойство BaseStream , чтобы попытаться найти внутренний FileStream
  • Чтение FileStream.Name

но имейте в виду, что почтовое сообщение (и, следовательно, вложения и их потоки) могут не быть собраны или очищены немедленно, поэтому вы не сможете удалить файл сразу. Вы могли бы лучше создать подклассы Attachment и одновременно записать имя файла и подкласс Dispose (выполнить после базового удаления), чтобы выполнить удаление, если вам действительно нужно сделать что-то подобное.

1 голос
/ 06 мая 2011

Обычно проще всего взять немного другую тактику и прикрепить ее через поток памяти, а не через файл.Таким образом вы избежите всех проблем, связанных с сохранением файлов на диск и последующей их очисткой.

Небольшая статья здесь об этом.

...