IOException удаление файлов, используемых вложений в MailMessage - PullRequest
0 голосов
/ 26 марта 2011

Я использую Visual Studio 2010 с .NET 4.0.

Я прикрепляю файлы с локального жесткого диска к MailMessage (то есть MailMessage.Attachements.Add(Attachment)). После выполнения команды SmtpClient.Send(MailMessage) я перебираю пути вложения и выполняю File.Delete(string path). Однако я сразу получаю System.IO.IOException.

System.IO.IOException: процесс не может получить доступ к файлу 'c: \ temp \ test.docx', поскольку он используется другим другим процессом. в System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) в System.IO.File.Delete (Строковый путь) ...

Я подумал, что, возможно, я не смогу удалить большие файлы, потому что они все еще передавались во время команды SmtpClient.Send. однако это, по-видимому, происходит для файлов всех размеров (от 2 КБ до 8 МБ). Может кто-нибудь, пожалуйста, уточнить, что происходит?

есть ли способ убедиться, что вызов SmtpClient.Send завершен (он полностью отправил электронное письмо с вложениями и снял все блокировки на файлы / вложения), прежде чем выполнить вызов File.Delete?

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

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

Я предлагаю обернуть создание нового объекта вложения в оператор using, чтобы обеспечить надлежащее удаление перед попыткойудалить файл.

2 голосов
/ 18 декабря 2014

Подайте это в категорию «лучше поздно, чем никогда»: у меня была та же проблема, и я смог ее решить, просто вызвав метод Dispose () на экземпляре MailMessage после отправки сообщения, например:

        try
        {
            MailMessage msg = new MailMessage();
            msg.To.Add(input.To);
            msg.From = new MailAddress(input.From);
            msg.Subject = input.Subject;
            msg.Body = input.Message;
            Attachment att = new Attachment(reportPath);
            msg.Attachments.Add(att);

            SmtpClient client = new SmtpClient(serverAddress, serverPort);
            client.Credentials = creds;
            client.EnableSsl = true;
            client.Send(msg);
            msg.Dispose();
        }
0 голосов
/ 26 марта 2011

Попробуйте использовать SendAsync() вместо этого. Он имеет обратный вызов, когда он завершен. В обратном вызове удалите свои файлы.

Обратный вызов client.SendCompleted для класса SMPTClient.

Если ничего другого, это может дать ключ к пониманию того, что происходит.

...