2011-02-07 14 views
6

estoy error al obtener tal como se menciona a continuación:conseguir "proceso no puede tener acceso al archivo" error al borrar los archivos después de enviar correo electrónico

archivo El proceso no tiene acceso "E: \ TempPDFs \ Sample.pdf" porque está siendo utilizado por otro proceso

Llego a enviar el pdf del correo electrónico y después de enviar el correo electrónico, necesito eliminar el archivo Sample.pdf. El código que he escrito no funciona

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

aquí rutadirectorio es E: \ TempPDFs, nombre de archivo es la Muestra

ACTUALIZADO:

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); 
        } 
       } 
      } 
     } 
    } 

que me haga saber si alguna consulta

Gracias!

+0

tu información, El Sample.pdf no está abierto cuando estoy recibiendo este error. –

+0

¿Su servicio SMTP tiene el archivo abierto para lectura (enviando el correo simultáneamente con su eliminación)? – AlG

+0

¿Puede proporcionar el código de envío del correo? ¿Estás creando PDF dinámicamente? – Anuraj

Respuesta

11

¿Podemos ver un código que es responsable de enviar un archivo PDF por correo electrónico? Su problema puede deberse a la transmisión de memoria no publicada. Si está utilizando una clase Attachment entonces usted debe hacer el siguiente aspecto:

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 
} 

La declaración using se asegurará de que el método Dispose se llama cuando el objeto sale del ámbito de aplicación.

ACTUALIZACIÓN

Después de llamar al método Send realizar una llamada a su correo de Dispose objeto de mensaje:

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

Hope esto le ayudará.

+0

Puede ver un código, pero como dije antes, excede el límite máximo de cualquier comentario –

+1

@Romil: No lo publique como comentario. Edite su pregunta en su lugar. – volpav

+0

Needful is done. –

0

o mejor aún si el objeto implementa IDisposable acaba de escribir como esto

((IDisposable)objSMTPClient).Dispose(); 
Cuestiones relacionadas