假設我正在使用File.WriteAllText向文件寫入很長的字符串,並且另一個線程或進程正在嘗試讀取同一文件。它會拋出任何異常嗎?換句話說,File.WriteAllText方法使用的FileShare參數是什麼?它沒有寫在文檔中!File.WriteAllText和併發訪問
回答
這是.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);
}
MSDN不記錄使用哪種共享模式。您可以查看源代碼(發佈的或通過反彙編程序),或者查看運行時的選項(例如,使用Process Monitor,然後將WIn32 API標誌翻譯爲FileShare
值)。
但,因爲它未記錄的補丁或新版本可以改變它。
或者,如果它的事項打開使用自己的FileStream
重載需要FileShare
參數的一個文件,打開StreamWriter
在這個,然後寫的文字。
它會拋出任何異常嗎?
是的。如果文件已經以不兼容的共享模式打開,則打開將失敗。
基於一些在反彙編器中查找的內容,'File.WriteAllText'使用'FileStreamn'傳遞'FileShare.Read'。 – Richard
+1「但由於沒有記錄補丁或新版本可能會改變它。」 – CodesInChaos
你已經反彙編了哪個框架版本? – Mehran
它會拋出任何異常嗎?
是的。您應該確保在一個進程正在寫入文件時,其他人不會通過使用lock
來讀取文件。即使您將FileShare
參數設置爲Read
(例如,允許隨後打開文件以供閱讀並且不立即拋出異常),但這不是一個好主意,因爲這些讀者可能會得到損壞的結果。
您將使用什麼樣的鎖進行進程間鎖定?我認爲通常的'lock {/ * code * /}'塊不夠用。 –
- 1. File.WriteAllText問題
- 2. unicode問題File.WriteAllText
- 3. spring context.refresh()和併發訪問
- 4. 併發訪問和縮放
- 5. C#和File.WriteAllText錯誤
- 6. requestcontextholder併發訪問
- 7. 扭曲和python列表併發訪問
- 8. SQLite和tomcat中的併發訪問
- 9. 併發訪問:波動性和同步
- 10. 春辛格爾頓和併發訪問
- 11. HazelCast TransactionalMap和併發線程訪問
- 12. Sinatra測試會話和併發訪問
- 13. 和的NodeJS SQL查詢 - 併發訪問
- 14. File.WriteAllText拋出UnauthorizedAccessException
- 15. 併發訪問列表
- 16. C++ fstream併發訪問
- 17. 用戶併發訪問
- 18. SQLite中的併發訪問
- 19. 去併發切片訪問
- 20. 併發訪問安全
- 21. 管理併發訪問
- 22. 併發訪問ESENT PersistentDictionary
- 23. Singleton EJB,JPA併發訪問
- 24. HashMap掛起併發訪問
- 25. C#併發列表訪問
- 26. 併發訪問SQLite Da
- 27. JUnit併發訪問synchronizedSet
- 28. 併發訪問組對象
- 29. Java中Singleton併發訪問
- 30. File.WriteAllText是否真的會引發FileNotFoundException?
[MSDN](http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –
@Jalal MSDN不會記錄哪個共享模式用於通過在'文件.WriteAllText'。 – CodesInChaos
對不起,我正在閱讀。我以爲他問的是'FileShare' .. –