该进程无法访问该文件,因为它正由另一个进程使用

Sri*_*nth 7 c# asp.net

我正在使用下面的代码在本地驱动器中创建一个包含内容的文件.

File.WriteAllLines(path, contents);
Run Code Online (Sandbox Code Playgroud)

我将此文件附加到邮件中并发送给团队.一旦发送邮件我需要删除该文件,删除我在下面的代码使用的文件,但我收到运行时错误

File.Delete(path);
Run Code Online (Sandbox Code Playgroud)

错误消息:进程无法访问该文件,因为它正被另一个进程使用

默认情况下,WriteAllLines()方法关闭文件但仍由另一个进程打开.我只能在一段时间后通过执行代码来删除文件,但这不是场景.邮件发送后我需要删除它.

更新

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage();

       mailMessage.To.Add(new System.Net.Mail.MailAddress(recipient, ToName));

       mailMessage.From = new System.Net.Mail.MailAddress(From, FromName);
       mailMessage.Subject = Subject; // "Outlook calendar as attachment";  // modified by Srikanth J on 28/06/2012
       mailMessage.Body = "This is a test message";

       System.Net.WebClient webclient = new System.Net.WebClient();

       webclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

       for (int i = 0; i < item.Attachments.Count; i++)
       {
           string url = item.Attachments.UrlPrefix + item.Attachments[i];
           SPFile file = item.ParentList.ParentWeb.GetFile(url);
           mailMessage.Attachments.Add(new System.Net.Mail.Attachment(file.OpenBinaryStream(), file.Name));

       }

       System.Net.Mail.Attachment mailAttachment = new System.Net.Mail.Attachment(path);

       mailMessage.Attachments.Add(mailAttachment);
       smtp.Send(mailMessage);
Run Code Online (Sandbox Code Playgroud)

任何帮助都是适当的,谢谢.

小智 15

MailMessage实现IDisposable,因此您应该使用using关键字在完成任务后释放任何资源.如果你不这样做,是的,很可能文件仍在使用,直到垃圾收集器发现你不再使用该消息为止.

using (var mailMessage = new MailMessage())
{
   // set mailMessage properties
   // ...
   smtp.Send(mailMessage);
}
Run Code Online (Sandbox Code Playgroud)

您也可以Dispose直接调用附件,但处理消息已经确保所有子对象(包括附件)都能正确处理.