文件作为附件发送后被锁定
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() 才能对创建图像的文件进行操作。
【讨论】:
以上是关于文件作为附件发送后被锁定的主要内容,如果未能解决你的问题,请参考以下文章