File locked after sending it as attachment

匆匆过客 提交于 2019-11-27 03:55:02

问题


I am sending a file as an attachment:

            // 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);

And then I want to move the file to another folder, however when I try to do this

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

                    }
                    catch (Exception ex)
                    {
                    }

Its throwing an exception that the file is already being used in another process. How I can unlock this file so that it can be moved to this location?


回答1:


Disposing your message will fix this for you. Try calling Dispose on your message before moving the file, like so:

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

When disposing MailMessage, all locks and resources are released.




回答2:


You need to take advantage of "using" keyword:

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

That's because "using" ensures IDisposable.Dispose method is called at the end of code block execution.

Whenever you use some class that's managing some resource, check if it's IDisposable and then use "using" block and you won't need to care about manually disposing calling IDisposable.Dispose.




回答3:


Attachments are IDisposable and should be disposed of correctly after they have been sent to release the lock on the file




回答4:


In order to prevent this file lock from happening, you could use using as this will dispose of the object automatically:

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:


Here's another way to dispose of the Attachments, once you've finished with them...

//  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:


A shared similar problem. I had to use image.dispose() on a given image before I could do something with the file that the image was created from.



来源:https://stackoverflow.com/questions/5191449/file-locked-after-sending-it-as-attachment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!