首页 > 解决方案 > 为什么 System.IO.File.AppendAllText 会锁定我的文件?

问题描述

为什么这段代码执行后,我不能手动删除生成的文件?我收到此错误消息:

The action can't be completed because the file is open in IIS Express Workers Process.

编码:

System.IO.File.AppendAllText("Filename.txt", "Some Text");

该应用程序是一个 Web 应用程序并在 IIS 中运行。我的理解是AppendAllText自动关闭文件句柄。

我没有使用此代码进行记录。代码的目的是创建一个 CSV 文件,然后将其附加到电子邮件中。如果我执行代码并通过电子邮件发送文件,则永远不会发送文件。如果我然后重新启动 IIS(以释放锁定)并仅执行代码以邮寄文件(不生成),它就可以工作。

附加文件的代码...

SmtpClient mailClient = new SmtpClient();
MailMessage msg = new MailMessage();
... Add From, Subject, Body, etc... here
msg.Attachments.Add(new Attachment(filename));
mailClient.Send(msg);

不会引发异常,不会将任何内容写入日志文件以指示问题。电子邮件根本没有发送,如果我转到生成的文件并尝试删除它,我不能因为 IIS 将其锁定。我相信锁定是电子邮件永远不会发送的原因。

标签: c#

解决方案


File.AppendAllText写入后关闭文件本身。但是您可能面临这个问题,因为该文件在您的 Web 应用程序中的多个会话之间共享。使用锁来防止并发访问。

您应该以不同的方式为 Web 应用程序处理您提供的代码。

using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
    System.IO.StreamWriter writer = new System.IO.StreamWriter(ms);
    writer.Write("Some Text");
    writer.Flush();
    writer.Dispose();
    ms.Position = 0;

    System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
    System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
    attach.ContentDisposition.FileName = "Filename.txt";

    SmtpClient mailClient = new SmtpClient();
    MailMessage msg = new MailMessage();
    msg.Attachments.Add(attach);
    mailClient.Send(msg);
}

在上面的示例中,附件是在内存中创建的,而不是在文件系统中存储的。


推荐阅读