c# - 为什么 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 将其锁定。我相信锁定是电子邮件永远不会发送的原因。
解决方案
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);
}
在上面的示例中,附件是在内存中创建的,而不是在文件系统中存储的。
推荐阅读
- css - 为什么将两个 flex 子项向右对齐会失败,而将一个子项对齐有效?
- git - 如何将基于分支的提交合并到另一个分支中?
- amazon-web-services - 在 Amazon CentOS 上使用 s3fs 自动挂载 S3 存储桶
- gis - Postgis 和 QIGS 长度计算的区别?
- c# - List 中的模型项绑定
- java - 在循环中区分同名的局部变量
- php - SQLite PDO - Data not inserted to database
- angular - 通过 GitHub 页面托管 Angular 应用程序时出错
- ios - iOS UIWebView - caching assets in native apap
- python - My dataframe returns 0 rows, yet when I use filters on excel spreadsheet the rows are displayed