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

问题描述

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

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

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

我严格地在网络上进行了一些研究,发现了另外question
所以我确保像那里提到的那样,使用所有参数正确设置了FileStream。
{{1 }}
是否有人知道我的问题的原因是什么?我最大的问题是,我无法真正复制它来表示它是在执行此操作时发生的。

编辑:我在using语句中使用FileStream以确保其正确处理。

解决方法

在没有实际看到代码的情况下很难正确地理解问题所在,但是根据我的经验,您没有正确地处理文件流对象,因此它无法处理文件

var fs = new FileStream(tempPathSave,FileMode.Open,FileAccess.Write,FileShare.ReadWrite)

因此,当您完成文件流的使用后,请致电

fs.Dispose();

这将正确处理文件流。

此外,您可以使用合成糖using,它会自动处理您的对象

using(var fs = new FileStream(tempPathSave,FileShare.ReadWrite)){
// use fs here
// STUFF
} //at the end fs will be disposed
,

我为我的问题找到了解决方案。我刚刚将FileStream更改为MemoryStream,因为MailMessage构造函数也可以处理流。唯一的要点是,必须保持MemoryStream打开,直到保存.eml文件。而且更重要的是,您必须注意内存使用情况,并确保随后将释放每个MemoryStream。