Ошибка «не удается получить доступ к файлу» при удалении файлов после отправки электронной почты - PullRequest
6 голосов
/ 07 февраля 2011

Я получаю сообщение об ошибке, как указано ниже:

Процесс не может получить доступ к файлу "E: \ TempPDFs \ Sample.pdf", поскольку он используется другим процессом

Я отправляю pdf по электронной почте, и после отправки письма мне нужно удалить файл Sample.pdf.Код, который я написал, не работает

FileInfo DeleteFileInfo = new FileInfo(directoryPath + "\\" + filename + ".pdf");
                            if (DeleteFileInfo.Exists)
                                File.Delete(directoryPath + "\\" + filename + ".pdf");

здесь каталог путь E: \ TempPDFs, имя файла Sample

ОБНОВЛЕНИЕ:

public static void SendMail(string fromAddress, string[] toAddress, string[] ccAddress, string[] bccAddress, string subject, string messageBody, bool isBodyHtml, ArrayList attachments, string host, string username, string pwd, string port)
    {

        {
            try
            {
                if (isBodyHtml && !htmlTaxExpression.IsMatch(messageBody))
                    isBodyHtml = false;
                // Create the mail message
                MailMessage objMailMsg;
                objMailMsg = new MailMessage();
                if (toAddress != null)
                {
                    foreach (string toAddr in toAddress)
                        objMailMsg.To.Add(new MailAddress(toAddr));
                }
                if (ccAddress != null)
                {
                    foreach (string ccAddr in ccAddress)
                        objMailMsg.CC.Add(new MailAddress(ccAddr));
                }
                if (bccAddress != null)
                {
                    foreach (string bccAddr in bccAddress)
                        objMailMsg.Bcc.Add(new MailAddress(bccAddr));
                }

                if (fromAddress != null && fromAddress.Trim().Length > 0)
                {
                    //if (fromAddress != null && fromName.trim().length > 0)
                    //    objMailMsg.From = new MailAddress(fromAddress, fromName);
                    //else
                    objMailMsg.From = new MailAddress(fromAddress);
                }

                objMailMsg.BodyEncoding = Encoding.UTF8;
                objMailMsg.Subject = subject;
                objMailMsg.Body = messageBody;
                objMailMsg.IsBodyHtml = isBodyHtml;

                if (attachments != null)
                {
                    foreach (string fileName in attachments)
                    {
                        if (fileName.Trim().Length > 0 && File.Exists(fileName))
                            objMailMsg.Attachments.Add(new Attachment(fileName));
                    }
                }

                //prepare to send mail via SMTP transport
                SmtpClient objSMTPClient = new SmtpClient();

                if (objSMTPClient.Credentials != null)
                {

                }
                else
                {
                    objSMTPClient.UseDefaultCredentials = false;
                    NetworkCredential SMTPUserInfo = new NetworkCredential(username, pwd);
                    objSMTPClient.Host = host;
                    objSMTPClient.Port = Int16.Parse(port);
                    //objSMTPClient.UseDefaultCredentials = false;
                    objSMTPClient.Credentials = SMTPUserInfo;
                    //objSMTPClient.EnableSsl = true;
                    //objSMTPClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                }
                //objSMTPClient.Host = stmpservername;
                //objSMTPClient.Credentials
                //System.Net.Configuration.MailSettingsSectionGroup mMailsettings = null;
                //string mailHost = mMailsettings.Smtp.Network.Host;
                try
                {
                    objSMTPClient.Send(objMailMsg);
                }
                catch (SmtpException smtpEx)
                {
                    if (smtpEx.Message.Contains("secure connection"))
                    {
                        objSMTPClient.EnableSsl = true;
                        objSMTPClient.Send(objMailMsg);
                    }
                }
            }
        }
    }

дайте мне знать, если какой-либо запрос

Спасибо!

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

Можем ли мы увидеть код, который отвечает за отправку PDF-файла по электронной почте? Ваша проблема может быть вызвана не освобожденным потоком памяти. Если вы используете класс Attachment , то вам нужно сделать следующее:

using (Attachment data = new Attachment("document.pdf",  MediaTypeNames.Application.Octet))
{
    // 1. Adding attachment to the e-mail message
    // 2. Sending out the e-mail message
}

Оператор using гарантирует, что метод Dispose вызывается, когда объект выходит из области видимости.

UPDATE

После вызова метода Send вызовите Dispose вашего почтового объекта сообщения:

objSMTPClient.Send(objMailMsg);
objMailMsg.Dispose();

Надеюсь, это поможет вам.

0 голосов
/ 02 декабря 2011

или еще лучше, если объект реализует IDisposable, просто напишите так

((IDisposable)objSMTPClient).Dispose();
...