我发送文件作为附件:
// 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)
{
}
它抛出了一个异常,即该文件已在另一个进程中使用。如何解锁此文件以便将其移动到此位置?
答案 0 :(得分:23)
处置您的message
将为您解决此问题。在移动文件之前,请尝试在邮件上调用Dispose
,如下所示:
message.Dispose();
File.Move(...)
处理MailMessage时,会释放所有锁和资源。
答案 1 :(得分:11)
您需要利用“使用”关键字:
using(Attachment att = new Attachment(...))
{
...
}
那是因为“using”确保在代码块执行结束时调用IDisposable.Dispose方法。
每当你使用某个管理某些资源的类时,检查它是否是IDisposable,然后使用“using”块,你不需要关心手动处理调用IDisposable.Dispose。
答案 2 :(得分:4)
Attachments为IDisposable,应在发送后释放文件上的锁定后正确处理
答案 3 :(得分: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
}
答案 4 :(得分:2)
这是处理附件的另一种方式,一旦你完成它们......
// 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();
}
答案 5 :(得分:0)
共同的类似问题。在我可以对创建图像的文件执行某些操作之前,我必须在给定图像上使用image.dispose()。