使用TempFileCollection删除ASP.NET MVC C#中的临时文件

本文关键字:临时文件 MVC NET TempFileCollection 删除 ASP 使用 | 更新日期: 2023-09-27 18:29:14

我有一个关于ASP.NET 5 MVC C#中的临时文件的问题。我想生成一个ics文件,然后将其存储为临时文件,用邮件发送,然后删除该文件。我在本地主机上尝试这个。我正在启动应用程序,然后执行API GET调用(通过浏览器….net/API/引号),并在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 folder 内的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。

使用TempFileCollection删除ASP.NET MVC C#中的临时文件

您需要处理您的MailMessage。它会对附加的文件进行锁定,并且在释放消息对象之前不会释放这些锁定。这就是为什么当你试图删除文件时会出现异常,也是TempFileCollection无法删除它的原因。

因此,您需要将MailMessage放入using语句中,或者在处理TempfileCollection之前显式调用它的Dispose。