Ответ 1
Устранение вашего message
исправит это для вас. Попробуйте вызвать Dispose
в своем сообщении перед перемещением файла, например:
message.Dispose();
File.Move(...)
При утилизации MailMessage все блокировки и ресурсы освобождаются.
Я отправляю файл в виде вложения:
// 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)
{
}
Отбрасывает исключение, что файл уже используется в другом процессе. Как я могу разблокировать этот файл, чтобы его можно было перемещать в это место?
Устранение вашего message
исправит это для вас. Попробуйте вызвать Dispose
в своем сообщении перед перемещением файла, например:
message.Dispose();
File.Move(...)
При утилизации MailMessage все блокировки и ресурсы освобождаются.
Вам нужно использовать ключевое слово "using":
using(Attachment att = new Attachment(...))
{
...
}
Это потому, что "использование" обеспечивает IDisposable.Dispose метод вызывается в конце выполнения блока кода.
Всякий раз, когда вы используете какой-либо класс, который управляет некоторым ресурсом, проверьте, является ли он IDisposable, а затем используйте блок "using", и вам не нужно заботиться о том, чтобы вручную избавиться от вызова IDisposable.Dispose.
Чтобы предотвратить эту блокировку файла, вы можете использовать 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
}
Вложения IDisposable и должны быть удалены правильно после того, как они были отправлены для освобождения блокировки файла
Вот еще один способ избавиться от вложений, как только вы закончите с ними...
// 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();
}
Общая аналогичная проблема. Мне пришлось использовать image.dispose() на данном изображении, прежде чем я смог что-то сделать с файлом, из которого было создано изображение.