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

时间:2011-03-04 08:41:20

标签: c# attachment locked-files

我发送文件作为附件:

            // 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)
                    {
                    }

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

6 个答案:

答案 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)

AttachmentsIDisposable,应在发送后释放文件上的锁定后正确处理

答案 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()。