文件作为附件发送后被锁定

Posted

技术标签:

【中文标题】文件作为附件发送后被锁定【英文标题】: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)
                    
                    

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

【问题讨论】:

message 是 MailMessage 吗?如果是这样,请在其上调用 .Dispose() 。这应该会释放文件锁定。 SMTP Send is locking up my files - c# 的可能重复项 【参考方案1】:

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

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

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

【讨论】:

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

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

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

   ...

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

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() 才能对创建图像的文件进行操作。

【讨论】:

以上是关于文件作为附件发送后被锁定的主要内容,如果未能解决你的问题,请参考以下文章

javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题

发送带有数据框的电子邮件作为附件

android导出到csv并作为电子邮件附件发送

将包含代码的 Excel 文件作为附件发送

将s3文件作为mailx中的附件发送

sendmailR(第 2 部分):将文件作为邮件附件发送