【问题标题】:File locked after sending it as attachment文件作为附件发送后被锁定
【发布时间】:2011-07-08 15:59:58
【问题描述】:

我将文件作为附件发送:

            // Create  the file attachment for this e-mail message.
            Attachment data = new Attachment(filePath, MediaTypeNames.Application.Octet);
            // Add time stamp information for the file.
            ContentDisposition disposition = data.ContentDisposition;
            disposition.CreationDate = System.IO.File.GetCreationTime(filePath);
            disposition.ModificationDate = System.IO.File.GetLastWriteTime(filePath);
            disposition.ReadDate = System.IO.File.GetLastAccessTime(filePath);
            // Add the file attachment to this e-mail message.
            message.Attachments.Add(data);

然后我想将文件移动到另一个文件夹,但是当我尝试这样做时

                    try
                    {
                        //File.Open(oldFullPath, FileMode.Open, FileAccess.ReadWrite,FileShare.ReadWrite);
                        File.Move(oldFullPath, newFullPath);

                    }
                    catch (Exception ex)
                    {
                    }

它抛出一个文件已经在另一个进程中使用的异常。如何解锁此文件以便将其移动到此位置?

【问题讨论】:

标签: c# attachment locked-files


【解决方案1】:

处置您的message 将为您解决此问题。在移动文件之前尝试在您的消息中调用Dispose,如下所示:

message.Dispose();
File.Move(...)

在释放 MailMessage 时,所有的锁和资源都会被释放。

【讨论】:

  • 嗨,alexn 是的,成功了!谢谢。抱歉回复晚了
【解决方案2】:

您需要利用“使用”关键字:

using(Attachment att = new Attachment(...))
{
   ...
}

这是因为“使用”确保 IDisposable.Dispose 方法在代码块执行结束时被调用。

每当您使用某个管理某个资源的类时,请检查它是否为 IDisposable,然后使用“使用”块,您无需关心手动处理调用 IDisposable.Dispose。

【讨论】:

    【解决方案3】:

    AttachmentsIDisposable,在发送它们以释放文件锁定后应正确处理

    【讨论】:

    • message.Dispose() 成功了 :) 感谢您的帮助 Greg
    【解决方案4】:

    为了防止这种文件锁定发生,您可以使用using,因为这会自动处理对象:

    using (Attachment data = new Attachment(filePath, MediaTypeNames.Application.Octet))
    {
        // Add time stamp information for the file.             
        ContentDisposition disposition = data.ContentDisposition;   
        disposition.CreationDate = System.IO.File.GetCreationTime(filePath);
        disposition.ModificationDate = System.IO.File.GetLastWriteTime(filePath);
        disposition.ReadDate = System.IO.File.GetLastAccessTime(filePath);
        // Add the file attachment to this e-mail message.
        message.Attachments.Add(data); 
        // Add your send code in here too
    }
    

    【讨论】:

      【解决方案5】:

      这是处理附件的另一种方法,一旦你完成它们......

      //  Prepare the MailMessage "mail" to get sent out...
      await Task.Run(() => smtp.Send(mail));
      
      //  Then dispose of the Attachments.
      foreach (Attachment attach in mail.Attachments)
      {
          //  Very important, otherwise the files remain "locked", so can't be deleted
          attach.Dispose();
      }
      

      【讨论】:

        【解决方案6】:

        一个共享的类似问题。我必须在给定图像上使用 image.dispose() 才能对创建图像的文件进行操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 2020-01-19
          • 2021-01-16
          • 1970-01-01
          • 2015-12-25
          • 1970-01-01
          相关资源
          最近更新 更多