2012-10-04 105 views
6

我正在使用下面的代碼在內容的本地驅動器中創建一個文件。該進程無法訪問該文件,因爲它正在被另一個進程使用

File.WriteAllLines(path, contents); 

我將此文件附加到郵件併發送給團隊。一旦郵件發送我需要刪除的文件,刪除我使用下面的代碼的文件,但我得到的運行時錯誤

File.Delete(path); 

錯誤消息:該進程無法訪問該文件,因爲它正在使用另一個過程

默認情況下,WriteAllLines()方法關閉文件,但它仍然由另一個進程打開。我只能在某段時間之後通過執行代碼來刪除文件,但這不是這種情況。郵件發送後我需要刪除它。

更新

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

任何幫助appriciated,謝謝。

+1

似乎將文件附加到郵件的過程仍然保存文件? –

+0

你可以發佈附加文件的代碼嗎? @CuongLe建議,這很可能是問題所在。 –

+0

@CuongLe你的意思是即使在發送郵件之後,它仍然由郵件進程持有? – Srikanth

回答

14

MailMessage實現IDisposable,所以你應該使用using關鍵字,當你用它做釋放任何資源。如果你不這樣做,是的,這個文件很可能會一直保持使用,直到垃圾收集器發現你不再使用該消息。

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

您也可以打電話Dispose直接附着,但消息的配置就已經確保所有子對象,包括附件,得到正確配置。

0

編輯

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

我以後sendind郵件表明,在最後你relese文件句柄或者如果你想這樣做,關閉文件

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

//after this delete the file 
+2

'使用'會更好。 –

+0

@ L.B - 是的,好主意,在這裏使用它,我剛剛粘貼sudo代碼,因爲op doent提供了任何代碼 –

1

,我建議寫你的文件將文件轉換爲流而不是文件。

這樣,您可以完全避免文件鎖定問題。

下面是一個演示如何基於流設置附件的示例(此處未顯示用於編寫流本身的代碼)。

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

只需添加一個簡單的使用語句將

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

這樣

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

改變時,從使用語句代碼退出MAILMESSAGE對象將每個對象設置以及實現IDisposable接口。這意味着,附件集合中的每個附件都將被丟棄,並且您的文件不再被鎖定。

1

試試這個

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

希望這有助於ü。

相關問題