2012-08-29 29 views
0

的無法打開文件,我得到了下面的代碼的StreamWriter可以因爲一個進程

protected override void Render(HtmlTextWriter writer) 
{ 

    // Write the HTML into this string builder 

    StringBuilder sb = new StringBuilder(); 
    StringWriter sw = new StringWriter(sb); 
    HtmlTextWriter hWriter = new HtmlTextWriter(sw); 
    base.Render(hWriter); 

    string pageHTML = sb.ToString(); 

    // Write it back to the server 
    writer.Write(pageHTML); 
    if (Convert.ToBoolean(this.ViewState["SendEmail"])) 
    { 
     string HTML = ""; 
     HTML = "<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML//EN'>"; 
     HTML += "<html>"; 
     HTML += "<head>"; 
     HTML += "<meta http-equiv='Content-Type'"; 
     HTML += "content='text/html; charset=iso-8859-1'>"; 
     HTML += "<title>Order Information</title>"; 
     HTML += "</head>"; 
     HTML += "<body>"; 
     HTML += "See attachment for information."; 
     HTML += "</body>"; 
     HTML += "</html>"; 

     MailMessage mail = new MailMessage("[email protected]", "[email protected]", "Subject", HTML); 
     mail.IsBodyHtml = true; 

     string path = @"d:\websites\plate.html"; 

     using (StreamWriter sw11 = File.CreateText(path)) 
     { 
      sw11.WriteLine(pageHTML); 
     } 

     mail.Attachments.Add(new Attachment(path)); 

     SmtpClient client = new SmtpClient("192.168.1.127"); 

     client.Send(mail); 

     Response.Write("<script>alert('Your information has been sent.')</script>"); 

     this.ViewState["SendEmail"] = false; 
    } 

} 

清新感/編譯我的解決方案的,當我按下發送鍵,調用該函數和HTML頁面後通過郵件附件發送沒有問題。但是,如果我嘗試再次按下發送按鈕,則會收到「System.IO.IOException:進程無法訪問文件'd:\ websites \ plate.html',因爲它正在被另一個進程使用。」當我試圖打開文件時發生錯誤。怎麼了?

+0

我希望硬編碼路徑只是爲了簡潔起見。在生產中,如果(如果)兩個或更多用戶同時執行此操作,則會出現問題。 –

+0

是的,例如,這是一個硬編碼路徑。 – Shadowizoo

回答

1

正如埃裏克·曾指出,你應該有一個using聲明SmtpClient - 同上MailMessage

但是,你還是會最終寫入文件系統沒有明顯的理由。我強烈建議你使用Attachment構造函數不需要需要一個文件開始。你可以寫一個MemoryStream,倒帶,然後例如提供Attachment。如果多個線程(或進程)試圖在同一時間運行此代碼

除了別的,這將意味着你不會有問題。

+0

using語句進行更正MAILMESSAGE我的問題:)謝謝喬恩 – Shadowizoo

+0

@Shadowizoo:它可以幫助你即時* *的問題,但我仍然認爲沒有理由在這裏介紹的文件系統上的依賴。 –

+0

我沒有使用過的唯一原因只是因爲我不知道MemoryStream。我做了一些搜索,最終得到了內存流,而不是依賴於文件系統。非常感謝 !!! – Shadowizoo

2

SmtpClient實現IDisposable,但你是不是配置的實例。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

它可持有到這個原因的文件。除非你有一個特定的原因(例如,你是通過持有IDisposable實例的類來顯式管理對象生命期),否則一般來說,將實現IDisposable的任何東西包裝到using語句中是明智的做法。

我也想提請注意@ DanPichelman的評論您正在使用恆定的文件名,但是這個代碼可以在並行單獨的線程執行。這會導致輸出文件被第一位用戶鎖定,直到第一位用戶完成代碼。

+0

我加了client.Dispose();後客戶端。發送(郵件);我也遇到了同樣的問題。 – Shadowizoo

+0

您應該使用* using *語句(不管這是否是實際問題),還是自己實現try/catch/finally。如果在代碼中間出現異常,您的client.Dispose()行將無法到達。 –

+0

我用smtpclient和MailMessage結合使用了一個using語句,問題就解決了。謝謝埃裏克。 – Shadowizoo

-2

我想你應該關閉它:

using (StreamWriter sw11 = File.CreateText(path)) 
{ 
    sw11.WriteLine(pageHTML); 
    sw11.Flush(); 
    sw11.Close(); 
} 
+1

'using'語句將會處理它(它也會刷新它)。 –

+0

對不起,這是我的錯,不小心。我很抱歉:( –

相關問題