Как снять блокировку с файла JPG

Я использую Microsoft.Office.Interop.MailItem, чтобы удалить вложения из электронной почты, сохранить их на диск, распечатать, а затем удалить с диска. У меня проблемы с удалением вложений JPG, кажется, файл заблокирован,

Вот мой код для сохранения каждого вложения,

foreach (Attachment attachment in outLookMessage.Attachments)
{
    var fileNameOnDisk = FileNameOnDisk(printFileFolder, attachment.FileName);

    attachment.SaveAsFile(fileNameOnDisk);
}

Я не уверен, почему файл JPG заблокирован. Можно ли как-то освободить этот журнал, чтобы удалить файл?


person Andre Lombaard    schedule 26.03.2013    source источник
comment
Что такое FileNameOnDisk? Это метод, который вы написали для сохранения файла в заданной папке? Я не могу найти его с первого взгляда в API, и если это так, вероятно, в этом методе создается блокировка (например, потому что при сохранении дескриптор был оставлен открытым для него).   -  person Chris    schedule 26.03.2013
comment
Какой у вас код для печати вложений? Вы также можете оставить там открытую ручку.   -  person Steve Czetty    schedule 26.03.2013


Ответы (2)


Я бы попробовал использовать attachment.Dispose() перед их удалением.

person Felix    schedule 26.03.2013
comment
Приложение является интерфейсом и не обязательно реализует IDisposable (хотя классы, которые его реализуют, могут). - person plinth; 26.03.2013

Наиболее вероятная причина заключается в том, что файл уже существует (и удерживается) или у вас нет разрешения на выполнение действия. Первый случай почти наверняка

Если файл существует, почему вы пишете поверх него? Это, вероятно, не то, что вы хотите сделать. Перед записью лучше проверить, существует ли файл и не заблокирован ли он, и при необходимости изменить имя. Второй ответ на этот вопрос содержит некоторый код для выяснения если файл заблокирован (точнее, чем просто IOException).

И что касается комментария Криса к вопросу (отличная идея, Крис), если файл существует, заблокирован и имеет нулевую длину, скорее всего, это ваша собственная ошибка в FileNameOnDisk. Закройте то, что вы открываете, если вы возвращаете путь (лучше всего) или откройте его с общим чтением/записью, верните файловый поток и закройте его, когда закончите (не лучший вариант).

person plinth    schedule 26.03.2013