2012-10-04 25 views
6

Estoy creando un archivo en la unidad local con contenido mediante el siguiente código.El proceso no puede acceder al archivo, porque lo está utilizando otro proceso

File.WriteAllLines(path, contents); 

Estoy adjuntando este archivo a un correo electrónico y enviándolo a todo el equipo. Una vez que el correo enviado tengo que borrar el archivo, borrar el archivo que estoy utilizando a continuación código, pero estoy consiguiendo error de ejecución

File.Delete(path); 

mensaje de error: El proceso no tiene acceso al archivo porque está siendo utilizado por otro proceso

por defecto El método WriteAllLines() cierra el archivo pero todavía está abierto por otro proceso. Solo puedo borrar el archivo ejecutando el código después de algún tiempo pero este no es el escenario. Necesito eliminarlo una vez que el correo ha sido enviado.

actualización

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 

     mailMessage.To.Add(new System.Net.Mail.MailAddress(recipient, ToName)); 

     mailMessage.From = new System.Net.Mail.MailAddress(From, FromName); 
     mailMessage.Subject = Subject; // "Outlook calendar as attachment"; // modified by Srikanth J on 28/06/2012 
     mailMessage.Body = "This is a test message"; 

     System.Net.WebClient webclient = new System.Net.WebClient(); 

     webclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 

     for (int i = 0; i < item.Attachments.Count; i++) 
     { 
      string url = item.Attachments.UrlPrefix + item.Attachments[i]; 
      SPFile file = item.ParentList.ParentWeb.GetFile(url); 
      mailMessage.Attachments.Add(new System.Net.Mail.Attachment(file.OpenBinaryStream(), file.Name)); 

     } 

     System.Net.Mail.Attachment mailAttachment = new System.Net.Mail.Attachment(path); 

     mailMessage.Attachments.Add(mailAttachment); 
     smtp.Send(mailMessage); 

Cualquier ayuda es appriciated, gracias.

+1

¿Parece que el proceso de adjuntar archivo al correo aún contiene el archivo? –

+0

¿Podría publicar el código donde adjunta el archivo? Es muy probable que exista el problema como sugirió @CuongLe. –

+0

@CuongLe ¿Quiere decir que, incluso después de enviar el correo, todavía lo retiene el proceso de correo? – Srikanth

Respuesta

14

MailMessage implementa IDisposable, por lo que debe utilizar la palabra clave using para liberar cualquier recurso cuando haya terminado con él. Si no hace eso, sí, es muy posible que el archivo permanezca en uso hasta que el recolector de basura se dé cuenta de que ya no está usando el mensaje.

using (var mailMessage = new MailMessage()) 
{ 
    // set mailMessage properties 
    // ... 
    smtp.Send(mailMessage); 
} 

También puede llamar Dispose para la fijación directa, pero disponiendo de un mensaje ya se asegurará de todos los objetos secundarios, incluyendo archivos adjuntos, conseguir dispuesto correctamente.

0

EDITAR

try 
{ 
    //send mail code 
} 
finally 
{ 
    mailAttachment=null; 
    mailMessage=null; 
} 
//delete file code 

Sugiero Correo que sendind en fin te relese el identificador de archivo o cerrar el archivo

try 
{ 
    //attach file 
    //send mail 
} 
finally 
{ 
    //set finally handle to null 
    // or close the file 
} 

//after this delete the file 
+2

'using' sería más agradable. –

+0

@ L.B - sí, es una buena idea usarlo. Acabo de pegar el código de sudo porque esto proporciona cualquier código. –

1

Si quieres hacer esto, sugeriría escribiendo el archivo a un archivo para transmitir en lugar de un archivo.

De esta manera, puede evitar el problema de bloqueo de archivos por completo.

Aquí hay un ejemplo que muestra cómo configurar los archivos adjuntos en función de una secuencia (aquí no se muestra el código para escribir la transmisión en sí).

private static void SendReport(Report report) 
{ 
    MailMessage msg = new MailMessage 
    { 
     From = new MailAddress(Configuration.EmailFrom), 
     Subject = Configuration.EmailSubject, 
     Body = Configuration.EmailBody 
    }; 

    msg.To.Add(Configuration.EmailTo); 

    if (!string.IsNullOrWhiteSpace(Configuration.EmailCC)) 
     msg.CC.Add(Configuration.EmailCC); 

    if (!string.IsNullOrWhiteSpace(Configuration.EmailBcc)) 
     msg.Bcc.Add(Configuration.EmailBcc); 

    Program.AttachReport(report, msg); 

    SmtpClient smtp = new SmtpClient(); 
    smtp.Send(msg); 
} 

private static void AttachReport(Report report, MailMessage message) 
{ 
    Stream stream = new MemoryStream(); 
    report.Save(stream, Configuration.SurveyName); 
    message.Attachments.Add(new Attachment(stream, Configuration.AttachmentName, Configuration.AttachmentMediaType)); 
} 
2

Sólo añadir una declaración simple Usando a su

System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 

para cambiar de esta manera

using(System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage()) 
{ 
     ....... 
     smtp.Send(mailMessage); 
} 

cuando la salida de su código de la instrucción using objeto MailMessage serán eliminados, así todos los objetos que implementa la interfaz IDisposable. Eso significa que se eliminarán todos los archivos adjuntos de la colección de archivos adjuntos y que sus archivos ya no estarán bloqueados.

1

tratar esta esperanza

File.WriteAllLines(path, contents); 
using(System.Net.Mail.MailMessage mailMessage 
           = new System.Net.Mail.MailMessage()) 
{ 
// send mail containing the file here 
} 
File.Delete(path); 

esto ayuda u.

Cuestiones relacionadas