我对ASP.NET 5 MVC C#中的临时文件有疑问。 我想生成一个ics文件,然后将其存储为临时文件,用邮件发送,然后删除该文件。 我在我的localhost尝试这个。我正在启动应用程序,然后执行API GET调用(通过浏览器.... net / api / quotes),并在GET方法中启动sendMailWithIcal方法。在我调用API之后,我在Visual Studio中停止了应用程序。
通过搜索stackoverflow,我找到了TempFileCollection。问题是我发送邮件后无法删除文件。我以两种不同的方式尝试它:“System.IO.File.Delete(path)”或“tempFiles.Delete()”:
public void SendMailWithICal(string receiver, string subject, string textBody)
{
this._msg = new MailMessage(UserName, receiver);
this._msg.Subject = subject;
this._msg.Body = textBody;
CalenderItems iCalender = new CalenderItems();
iCalender.GenerateEvent("Neuer Kalendereintrag");
var termin = iCalender.iCal;
using (var tempFiles = new TempFileCollection())
{
tempFiles.AddFile("TempIcsFiles/file3.ics", false);
System.IO.File.WriteAllText("TempIcsFiles/file3.ics", termin.ToString());
Attachment atm = new Attachment("TempIcsFiles/file3.ics");
this._msg.Attachments.Add(atm);
System.IO.File.Delete(("TempIcsFiles/file3.ics")); //Either i try this
//tempFiles.Delete(); //or this
}
this._smtpClient.Send(_msg);
}
如果我使用System.IO.File.Delete尝试它,我会收到一个异常,它无法访问该文件,因为它被另一个进程使用。如果我使用tempfiles.Delete(),则没有异常,它会发送邮件,但文件不会从wwwroot文件夹中的TempIcsFiles文件夹中删除
感谢您的帮助。
编辑: 我用这段代码尝试了解决方案Mikeal Nitell:
var termin = iCalender.iCal;
using (var tempFiles = new TempFileCollection())
{
tempFiles.AddFile("TempIcsFiles/file6.ics", false);
//tempFiles.Delete();
System.IO.File.WriteAllText("TempIcsFiles/file6.ics", termin.ToString());
Attachment atm = new Attachment("TempIcsFiles/file6.ics");
this._msg.Attachments.Add(atm);
this._smtpClient.Send(_msg);
this._msg.Dispose();
atm.Dispose();
}
System.IO.File.Delete(("TempIcsFiles/file6.ics"));
现在我收到了无法访问该文件的IOException,因为另一个进程正在使用它,已经在“System.IO.File.WriteAllText(...)”的行中
如果我取消注释这一行,我收到一个FileNotFoundException后面的一行我初始化附件。
答案 0 :(得分:2)
您需要处理MailMessage。它会锁定您附加的文件,并且在处理消息对象之前不会释放这些锁。这就是您尝试删除文件时出现异常的原因,这也是TempFileCollection无法删除它的原因。
因此,您需要将MailMessage放在using语句中,或者在部署TempfileCollection之前显式调用Dispose。