Удалить файл вложения
Я использую System.Net.Mail для отправки почты в asp.net..
как удалить файл вложения после его отправки в виде вложения.
Я попытался использовать метод File.Delete.. но я получаю эту ошибку.
процесс не может получить доступ к файлу path\fun.jpg ', потому что он используется другим процессом.
спасибо
Ответы
Ответ 1
Утилизируйте MailMessage, когда закончите с ним.
У него по-прежнему есть блокировка файла, который вы добавили в качестве вложения, пока вы этого не сделали.
var filePath = "C:\\path\\to\\file.txt";
var smtpClient = new SmtpClient("mailhost");
using (var message = new MailMessage())
{
message.To.Add("[email protected]");
message.From = new MailAddress("[email protected]");
message.Subject = "Test";
message.SubjectEncoding = Encoding.UTF8;
message.Body = "Test " + DateTime.Now;
message.Attachments.Add(new Attachment(filePath));
}
if (File.Exists(filePath)) File.Delete(filePath);
Console.WriteLine(File.Exists(filePath));
Выход: False
Я бы предположил, что если у вас все еще есть что-то, блокирующее файл после удаления сообщения, у вас скорее всего будет другая блокировка файла, но без кода мы не сможем вам помочь.
Ответ 2
Вы не можете удалить прикрепленный файл после отправки почты. Перед отправкой вы можете удалить.
В чем ошибка говорит, что путь, о котором вы упоминали, использует какой-то другой процесс.
MailMessage Message = new MailMessage();
Message.Subject = "Attachment Test";
Message.Body = "Check out the attachment!";
Message.To.Add("[email protected]");
Message.From = "[email protected]";
Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text));
Обратите внимание, что мы создали вложение из MemoryStream, и мы получили имя приложения, которое мы хотим. Имя вложения во втором параметре - это имя файла в письме, а не имя на локальном системном жестком диске. На самом деле приложение никогда не идет на локальный жесткий диск. Третий параметр - тип Mime вложения, в нашем случае это текст.
Изменить: use Dispose() the mail
Ответ 3
Расширение класса MailMessage - хороший способ решить эту проблему и уменьшить вероятность повторного запуска этой проблемы...
class MyMailMessage : MailMessage, IDisposable
{
private List<string> _tempFiles = new List<string>();
public void Attach(string filename)
{
base.Attachments.Add(new Attachment(filename));
this._tempFiles.add(filename);
}
new public void Dispose()
{
base.Dispose();
this._tempFiles.Foreach(x => File.Delete(x));
}
}
... и не забудьте использовать с конструкцией 'using' (которую вы все равно должны использовать)...
using(SmtpClient client = GetMySmtpClient())
using(MyMailMessage msd = new MyMailMessage())
{
msg.Attach(filename);
client.send(msg);
}
Ответ 4
Вам просто нужно удалить объект сообщения перед удалением файла. Например:
Dim message As New MailMessage
message.From = New MailAddress(fromEmail, fromName)
message.Subject = subject
message.CC.Add(toCCEmail)
message.Bcc.Add(toBCCEmail)
Dim attach As Attachment = New Attachment(attachmentPath)
message.Attachments.Add(attach)
message.IsBodyHtml = True
message.Body = body
mailClient.Send(message)
message.Dispose() 'Add this line to dispose the message!
Ответ 5
Если у вашей почты есть много вложений
List<Attachments> lstAtt = new List<Attachments>();
Attachment att = new Attachment(file);
lstAtt.Add(att);
//finally
foreach(var a in lstAtt)
{
a.Dispose();
}
//delete file