2012-10-04 24 views
6

Sto creando un file nell'unità locale con contenuto utilizzando il codice riportato di seguito.Il processo non può accedere al file, perché è utilizzato da un altro processo

File.WriteAllLines(path, contents); 

Allego questo file a una mail e inviando il resto del team. Una volta mail inviata ho bisogno di eliminare il file, per eliminare il file che sto usando qui di seguito il codice, ma sto ottenendo errore di runtime

File.Delete(path); 

messaggio di errore: Il processo non può accedere al file perché è utilizzato da un altro processo

per impostazione predefinita, il metodo WriteAllLines() chiude il file, ma viene comunque aperto da un altro processo. Posso solo cancellare il file eseguendo il codice dopo qualche tempo, ma questo non è lo scenario. Devo cancellarlo una volta che la posta è stata inviata.

Aggiornamento

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

Ogni aiuto è appriciated, grazie.

+1

Sembra che il processo per allegare il file alla posta conservi ancora il file? –

+0

Potresti postare il codice dove si allega il file? È molto probabile che ci sia il problema come suggerito da @CuongLe. –

+0

@CuongLe Vuoi dire che anche dopo l'invio della posta è ancora trattenuto dal processo di posta? – Srikanth

risposta

14

MailMessage implementa IDisposable, quindi si dovrebbe utilizzare la parola chiave using per liberare tutte le risorse quando hai finito con esso. Se non lo fai, sì, è molto ben possibile che il file rimanga in uso finché il garbage collector non si accorge che non stai più utilizzando il messaggio.

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

Si potrebbe anche chiamare Dispose per l'attacco direttamente, ma lo smaltimento di un messaggio sarà già garantire che tutti oggetti secondari, inclusi gli allegati, avere smaltito correttamente.

0

EDIT

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

suggerisco dopo la posta sendind nel finalmente relese l'handle di file o chiudere il file

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

//after this delete the file 
+2

"using" sarebbe più bello. –

+0

@ L.B - sì, è una buona idea usarlo qui ho appena incollato il codice sudo per questo perché op doent ha fornito qualsiasi codice –

1

Se si vuole fare questo, vorrei suggerire a scrivere il file in un file su Stream piuttosto che su un file.

In questo modo, è possibile evitare completamente il problema del blocco dei file.

Ecco un esempio che mostra come impostare l'allegato in base a uno stream (il codice per scrivere il flusso stesso non viene mostrato qui).

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

Basta aggiungere una semplice dichiarazione Utilizzando al

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

a cambiare in questo modo

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

quando il vostro codice di uscita dalla istruzione using l'oggetto mailMessage sarà smaltito come pure ogni oggetto che implementa l'interfaccia IDisposable. Ciò significa che ogni singolo allegato nella collezione Attachments sarà eliminato e i tuoi file non saranno più bloccati.

1

provare questo

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

Spero che questo aiuta u.

Problemi correlati