Файл заблокирован после отправки в виде вложения

Отправляю файл как вложение:

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

Выдает исключение, что файл уже используется в другом процессе. Как я могу разблокировать этот файл, чтобы его можно было переместить в это место?


person JMon    schedule 04.03.2011    source источник
comment
Сообщение - это MailMessage? Если это так, вызовите для него .Dispose (). Это должно снять блокировку файла.   -  person alexn    schedule 04.03.2011


Ответы (6)


Утилизация вашего message исправит это за вас. Попробуйте вызвать Dispose в своем сообщении перед перемещением файла, например:

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

При удалении MailMessage все блокировки и ресурсы освобождаются.

person alexn    schedule 04.03.2011
comment
Привет, Алексей. Да, это помогло! Спасибо. Извините за поздний ответ - person JMon; 07.03.2011

Вам нужно воспользоваться ключевым словом "using":

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

Это потому, что "using" гарантирует, что метод IDisposable.Dispose вызывается в конце выполнения блока кода.

Всякий раз, когда вы используете какой-либо класс, который управляет каким-либо ресурсом, проверьте, является ли он IDisposable, а затем используйте блок «using», и вам не нужно будет заботиться о ручном удалении вызова IDisposable.Dispose.

person Matías Fidemraizer    schedule 04.03.2011

Вложения: IDisposable и должны быть правильно утилизированы после отправки для снятия блокировки файла.

person Greg B    schedule 04.03.2011
comment
message.Dispose () сделал свое дело :) Спасибо за помощь Грег - person JMon; 07.03.2011

Чтобы предотвратить эту блокировку файла, вы можете использовать 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
}
person Neil Knight    schedule 04.03.2011

Вот еще один способ избавиться от вложений, когда вы закончите с ними ...

//  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();
}
person Mike Gledhill    schedule 17.05.2018

Общая аналогичная проблема. Мне пришлось использовать image.dispose () для данного изображения, прежде чем я смог что-то сделать с файлом, из которого было создано изображение.

person David    schedule 19.06.2016