我写了一些代码,用C#将文件作为.eml文件的附件发送
我在Windows临时文件夹中创建文件,并将它们附加到.eml文件中。.eml文件只需打开即可,并使用windows中的标准邮件程序通过Process.Start(filename);
发送。如果用户希望再次发送该文件,则会从数据库中重写该文件,以确保其为最新版本
现在我的问题是:随机几次或在我第一次重写文件后,错误出现
进程无法访问该文件,因为另一个进程正在使用该文件
我在网上做了一些研究,发现了另一个问题
因此,我确保如前所述,所有参数都正确设置了FileStreamvar fs = new FileStream(tempPathSave, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
有人知道我的问题是什么原因吗?我最大的问题是,当我做这个或那个时,我不能真的重复它来说它正在发生。
编辑:我在using语句中使用FileStream,以确保它被正确处理。
如果没有实际看到代码,很难正确理解问题所在,但根据我的经验,您没有正确处理文件流对象,因此它保留了文件的句柄
var fs = new FileStream(tempPathSave, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
因此,当你使用完文件流后,请致电
fs.Dispose();
这将正确处理您的文件流。
此外,您可以使用语法糖using
,它将自动处理您的对象
using(var fs = new FileStream(tempPathSave, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)){
// use fs here
// STUFF
} //at the end fs will be disposed
我找到了解决问题的方法。我刚刚将FileStream更改为MemoryStream,因为MailMessage构造函数也可以处理流。唯一的一点是,在保存.eml文件之前,必须保持MemoryStream的打开状态。更重要的是,你必须注意内存的使用情况,并确保之后每个MemoryStream都会被处理掉。