【问题标题】:after email deleting attachment file, error "The process cannot access the file because it is being used by another process."电子邮件删除附件文件后,错误“该进程无法访问该文件,因为它正在被另一个进程使用。”
【发布时间】:2018-04-25 15:33:12
【问题描述】:

我正在做一个电子邮件表格。电子邮件有附件,并在附加文件后发送电子邮件。接下来需要从服务器中删除文件。当我试图获取文件时,它给了我主题错误。我什至在删除文件之前调用了 GC.Collect() 但错误仍然存​​在。我删除文件的代码是:

 private void DeleteFiles(DataTable dt)
{
    GC.Collect();
    String[] sAttachments = new String[dt.Rows.Count];
    try
    {

        sAttachments = new String[dt.Rows.Count];
        for (Int32 J = 0; J < dt.Rows.Count; J++)
        {
            sAttachments[J] = dt.Rows[J]["AttachmentExt"].ToString().Trim();
            string workDir = Server.MapPath(".") + @"\upload\";
            if (File.Exists(workDir + sAttachments[J]))
                File.Delete(workDir + sAttachments[J]);                
        }
    }
    catch (Exception ex)
    {

    }

要将文件附加到电子邮件中,我的代码是:

 oMess.Subject = sSubject; 
        string workDir = System.Web.HttpContext.Current.Server.MapPath(".") + @"\upload\";
        if (Attachments != null)
        {
            for (Int32 I = 0; I < Attachments.Length; I++)
            {
                oatt = new Attachment(workDir+ sAttachments[I]);
                oMess.Attachments.Add(oatt);
            }
        }
        oMess.IsBodyHtml = IsHtml;
        oMess.Body = sBody;
       SendMessageGmail(oMess);

编辑:我的邮件发送代码是:

 private void SendMessageGmail(MailMessage message)        
    {
        SmtpClient client = new SmtpClient("smtp.gmail.com");
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;
        NetworkCredential loginInfo = new NetworkCredential("myid", "mypassword");
        client.Credentials = loginInfo;
        client.Port = 587;
        client.Send(message);
    }

请指导和帮助。谢谢

【问题讨论】:

  • oMess 是什么类型的?如果是System.Net.Mail.MailMessage,您可以在尝试删除文件之前尝试调用Dispose()
  • @rsbarro,我应该在发送电子邮件后调用 Dispose() 吗?还是在 oMess.Attachments.Add(oatt) 之后?
  • @user576510 在发送电子邮件后尝试删除文件之前尝试。在 MailMessage 上调用 Dispose() 也会处理附件。
  • @rsbarro,我做到了,但仍然收到相同的错误消息。
  • @user576510 你能发布更多代码吗? AFAIK Dispose 应该有效。

标签: c# .net asp.net


【解决方案1】:

使用这个。它对我有用

client.Send(oMess);
oMess.Attachments.Dispose();

我试过这个,但它不适合我

client.Send(oMess);
oMess.Dispose();

【讨论】:

  • 最后一个对我有用。我将它与using 一起使用:using (MailMessage mail = new MailMessage ()) { /* setup and send mail */ }
【解决方案2】:

你应该尝试做 oatt.Dispose();

【讨论】:

  • 我应该在发送电子邮件后调用 Dispose() 吗?还是在 oMess.Attachments.Add(oatt) 之后?
  • 尝试oMess.Attachments.Add(oatt);
【解决方案3】:

执行“SendMessageGmail”后,通过迭代释放MailMessage.Attachments的附件。

SendMessageGmail(oMess);
if(oMess.Attachments != null) {
  for(Int32 I = oMess.Attachments.Count - 1; I >= 0;I--) {
    oMess.Attachments[i].Dispose();
  }
  oMess.Attachments.Clear();
  oMess.Attachments.Dispose();
}
oMess.Dispose();
oMess = null;

【讨论】:

    【解决方案4】:
    oMess.Dispose()
    

    这对我有用。

    【讨论】:

      【解决方案5】:

      使用下面的代码填充图像框,这样就可以解决删除文件的问题了。

      pictureBox1.Load(filePath);   
      

      【讨论】:

        【解决方案6】:

        这对我有用:

        FileStream file = new FileStream(attachment, FileMode.Open, FileAccess.Read);
        MemoryStream ms = new MemoryStream();
        byte[] bytes = new byte[file.Length];
        file.Read(bytes, 0, (int)file.Length);
        ms.Write(bytes, 0, (int)file.Length);
        
        objEmail.Attachments.Add(new Attachment(ms, new FileInfo(attachment).Name));
        
        file.Close();
        ms.Close();
        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();
        System.IO.File.Delete(attachment);
        

        【讨论】:

        • 以上代码工作正常,但需要更改一行 objEmail.Attachments.Add(new Attachment(new MemoryStream(bytes), new FileInfo(attachment).Name));
        【解决方案7】:
        private void SendMessageGmail(MailMessage message)       
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com");
            client.EnableSsl = true;
            client.UseDefaultCredentials = false;
            NetworkCredential loginInfo = new NetworkCredential("myid", "mypassword");
            client.Credentials = loginInfo;
            client.Port = 587;
            client.Send(message);
            oatt.Dispose();
        }
        

        【讨论】:

        • 未声明燕麦
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2010-12-10
        相关资源
        最近更新 更多