【问题标题】:File can´t rewritten because other process uses the file文件无法重写,因为其他进程使用该文件
【发布时间】:2020-08-24 14:37:48
【问题描述】:

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

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

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

我确实在网上做了一些研究,发现了另一个question。
所以我确保像那里提到的那样,FileStream 的所有参数都正确设置。
var fs = new FileStream(tempPathSave, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
有有人知道我的问题的原因是什么?我最大的问题是,当我这样做或那样做时,我无法真正复制它来说它正在发生。

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

【问题讨论】:

  • 在您所指的问题中,FileStream 位于“使用”块内,因此可以正确处理。
  • 电子邮件程序是否仍有可能访问该文件?
  • 我在 using 语句中包含所有内容,以确保 FileStream 已关闭。我总是检查任务管理器,邮件程序已关闭。但我也可以让邮件程序打开几次,直到出现异常。有时它会在第一次之后直接出现。所以……我不知道。
  • 好吧,一个解决方法是只使用另一个文件名......有时FS可能是一个b1tch。
  • 我同意@Fildor 的概念。我会在临时文件夹中创建一个专用目录并使用唯一的文件名(guid)。我会定期进行清理 - 删除超过 2 小时的文件。

标签: c# filestream file-access


【解决方案1】:

如果不实际查看代码,很难正确理解问题所在,但根据我的经验,您没有正确处理文件流对象,因此它保留了文件句柄

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

【讨论】:

  • 虽然您的建议是一种很好的做法,但在这种情况下,也可能是邮件程序没有干净地释放文件句柄。 Windows fs 可能对这一切都很讨厌。
  • 实际上我在使用条件下使用 FileStream...所以...处置 FS 应该不是问题。
【解决方案2】:

我找到了解决问题的方法。我只是将 FileStream 更改为 MemoryStream,因为 MailMessage 构造函数也可以处理流。唯一的一点是,在保存 .eml 文件之前,您必须保持 MemoryStream 处于打开状态。更重要的是,您必须注意内存使用情况,并确保之后每个 MemoryStream 都会被释放。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多