我有一个简单的 C# 应用程序,可以发送 SMTP 电子邮件(使用 System.Net.Mail 类)。发送(通过电子邮件发送)MailMessage 对象后,我想遍历附件列表并删除与这些附件关联的原始文件......但我很难找到与每个附件关联的完整文件路径 - 不保留我的自己的附件文件路径集合。必须有一种从附件对象中提取完整文件路径的好方法。
我知道这一定很简单,但我花了很多时间在这上面……有时间问别人。
我有一个简单的 C# 应用程序,可以发送 SMTP 电子邮件(使用 System.Net.Mail 类)。发送(通过电子邮件发送)MailMessage 对象后,我想遍历附件列表并删除与这些附件关联的原始文件......但我很难找到与每个附件关联的完整文件路径 - 不保留我的自己的附件文件路径集合。必须有一种从附件对象中提取完整文件路径的好方法。
我知道这一定很简单,但我花了很多时间在这上面……有时间问别人。
如果您通过Attachment
带参数的构造函数添加附件filePath
,则可以通过ContentStream
属性检索这些附件,并且这些附件的类型为FileStream
. 以下是获取附加文件的文件名的方法:
var fileNames = message.Attachments
.Select(a => a.ContentStream)
.OfType<FileStream>()
.Select(fs => fs.Name);
但不要忘记先 disposeMailMessage
对象,否则将无法删除这些附件:
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);
}
你可以
但请记住,邮件消息(以及附件及其流)可能不会立即被收集或清理,因此您可能无法立即删除文件。如果您确实需要以这种方式执行操作,您可能会更好地对 Attachment 进行子类化,并记录文件名和子类 Dispose(在基本 dispose 之后执行)来执行删除操作。
通常最容易采取稍微不同的策略并通过内存流而不是文件进行附加。这样,您就可以避免将文件保存到磁盘并在之后清理它们的所有问题。