无法重写文件,因为其他进程使用该文件



我写了一些代码,用C#将文件作为.eml文件的附件发送
我在Windows临时文件夹中创建文件,并将它们附加到.eml文件中。.eml文件只需打开即可,并使用windows中的标准邮件程序通过Process.Start(filename);发送。如果用户希望再次发送该文件,则会从数据库中重写该文件,以确保其为最新版本

现在我的问题是:随机几次或在我第一次重写文件后,错误出现

进程无法访问该文件,因为另一个进程正在使用该文件

我在网上做了一些研究,发现了另一个问题
因此,我确保如前所述,所有参数都正确设置了FileStream
var 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都会被处理掉。

最新更新