2011-07-24 37 views
12

假設我正在使用File.WriteAllText向文件寫入很長的字符串,並且另一個線程或進程正在嘗試讀取同一文件。它會拋出任何異常嗎?換句話說,File.WriteAllText方法使用的FileShare參數是什麼?它沒有寫在文檔中!File.WriteAllText和併發訪問

+0

[MSDN](http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –

+0

@Jalal MSDN不會記錄哪個共享模式用於通過在'文件.WriteAllText'。 – CodesInChaos

+0

對不起,我正在閱讀。我以爲他問的是'FileShare' .. –

回答

9

這是.NET Framework 4.0的源代碼。顯然StreamWriter是使用FileShare.Read內部使用的。

[SecuritySafeCritical] 
public static void WriteAllText(string path, string contents) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    if (path.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); 
    } 
    InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM); 
} 


private static void InternalWriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 

這是爲StreamWriter創建基礎流的代碼。

private static Stream CreateFile(string path, bool append) 
{ 
    return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan); 
} 
5

MSDN不記錄使用哪種共享模式。您可以查看源代碼(發佈的或通過反彙編程序),或者查看運行時的選項(例如,使用Process Monitor,然後將WIn32 API標誌翻譯爲FileShare值)。

,因爲它未記錄的補丁或新版本可以改變它。

或者,如果它的事項打開使用自己的FileStream重載需要FileShare參數的一個文件,打開StreamWriter在這個,然後寫的文字。

它會拋出任何異常嗎?

是的。如果文件已經以不兼容的共享模式打開,則打開將失敗。

+0

基於一些在反彙編器中查找的內容,'File.WriteAllText'使用'FileStreamn'傳遞'FileShare.Read'。 – Richard

+0

+1「但由於沒有記錄補丁或新版本可能會改變它。」 – CodesInChaos

+0

你已經反彙編了哪個框架版本? – Mehran

4

它會拋出任何異常嗎?

是的。您應該確保在一個進程正在寫入文件時,其他人不會通過使用lock來讀取文件。即使您將FileShare參數設置爲Read(例如,允許隨後打開文件以供閱讀並且不立即拋出異常),但這不是一個好主意,因爲這些讀者可能會得到損壞的結果。

+0

您將使用什麼樣的鎖進行進程間鎖定?我認爲通常的'lock {/ * code * /}'塊不夠用。 –