【问题标题】:Unable to delete a file created by FileHelper assembly无法删除由 FileHelper 程序集创建的文件
【发布时间】:2017-12-29 08:12:06
【问题描述】:

我正在从 db 获取详细信息并使用 FileHelper 将它们写入文件,将文件作为电子邮件的一部分附加,并在发送邮件后尝试删除文件。

 var engine = new FileHelperEngine<DataModel>();

 engine.WriteFile(filePath, data);

 //After Mail is sent, deleting the file.
 if (File.Exists(filePath))
 {                           
   File.Delete(filePath); //Error is thrown here
 }

异常:进程无法访问文件 '..//somefilepath' 因为它正被另一个进程使用。

我必须在发送邮件后立即删除这些文件,让它们驻留在服务器上会占用服务器中的空间。

当这些文件被另一个进程持有时,如何删除这些文件?

编辑:感谢大家的回复。 出现此问题的原因是 Attachment 实例持有该文件并且不允许我删除该文件。

MailMessage mailobj= new MailMessage();
Attachment data = new Attachment(filePath);
mailobj.Attachments.Add(data);

//after sending mail, i disposed the data
 data.Dispose();

【问题讨论】:

  • 您不能删除正在使用的文件。 Windows 不允许。我建议您在每次新尝试之前多试几次。
  • 邮件发送后 这会引发危险信号。您是否将该文件添加为指控,并且您是否在该邮件发送过程中使用 using 语句?请出示发送邮件的代码。
  • 确保妥善处理所有物品。我在这里怀疑您的代码没有处理所有一次性物品。当您处理“数据”时,您已经将其添加到集合中,并且一旦您要求服务器对象发送邮件,它将打开该文件,而不是附件对象。

标签: c# file process filehelpers


【解决方案1】:

如果有另一个进程(例如本地电子邮件客户端)访问/链接文件,您必须在 File.Delete 之前关闭此进程。也许不是直接使用该文件,您可以尝试 MemoryStream 将文件复制到您可以处置的内存中,以确保该文件不被其他进程使用,然后您可以执行 File.Delete。

【讨论】:

    【解决方案2】:

    问题不是来自问题中的代码。 WriteFile() 函数会自动打开、写入和关闭文件,因此文件不会继续使用。邮件客户端是您尝试删除该文件时仍在使用该文件的罪魁祸首。在尝试删除文件之前,请确保它完成并释放文件。如果您需要帮助,请编辑您的问题并添加发送邮件的代码。

    注意:部分邮件客户端发送成功后会自动删除文件。检查您的邮件客户端是否有该功能并启用它,这样您就不需要自己删除文件了。

    还有一些邮件客户端接受内存流。如果您的邮件客户端接受内存流,您可以考虑将数据保存到MemoryStream 并将其传递给邮件客户端而不是文件。这样您就不必担心创建和删除文件。

    【讨论】:

    • 你是对的。这不是 FileHelper 的 WriteLine()。作为发送邮件的一部分,我有一个附件实例,它保存着文件。
    • 您应该将此标记为答案,以便其他人知道而无需深入研究 cmets
    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2018-11-06
    • 2011-02-03
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多