C#讀寫文本文件一般都是用StreamWriter來實現(讀書的時候就這樣用,畢業後這幾年基本也是這樣干的),通常代碼如下:
using (StreamWriter sw = new StreamWriter(logpath,true,Encoding.UTF8))
{
sw.WriteLine(msg);
}
如果是web開發或則其他多線程的時候一般都是加鎖(用lock),如果不同lock就會有error如:
這天我一同事推薦我說用FileStream可以不用lock,在多線程的情況下是不會有問題的,代碼如下:
using (FileStream fs = new FileStream(logpath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.Write(msg);
}
}
經過測試後發現在多線程下卻實沒有問題,於是回頭查看了以下StreamWriter的定義,
[SecurityCritical] internal StreamWriter(string path, bool append, Encoding encoding, int bufferSize, bool checkHost) : base(null) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } if (path.Length == 0) { throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); } if (bufferSize <= 0) { throw new ArgumentOutOfRangeException("bufferSize", Environment.GetResourceString("ArgumentOutOfRange_NeedPosNum")); } Stream streamArg = CreateFile(path, append, checkHost); this.Init(streamArg, encoding, bufferSize, false); } [SecurityCritical] private static Stream CreateFile(string path, bool append, bool checkHost) { return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost); }
注意這裡的CreateFile方法,裡面用的是FileShare.Read,有關Read和 ReadWrite 的區別如下:
Read 允許隨後打開文件讀取。如果未指定此標志,則文件關閉前,任何打開該文件以進行讀取的請求(由此進程或另一進程發出的請求)都將失敗。但 是,即使指定了此標志,仍可能需要附加權限才能夠訪問該文件。
ReadWrite 允許隨後打開文件讀取或寫入。如果未指定此標志,則文件關閉前,任何打開該文件以進行讀取或寫入的請求(由此進程或另一進程發出)都將失敗。但是,即使指定了此標志,仍可能需要附加權限才能夠訪問該文件。
我想單獨就FileShare屬性大家都知道,可是在這裡就StreamWriter和FileStream大家是否也知道這個問題了。有關StreamReader/StreamWriter與FileStream用法詳解如下:
http://blog.csdn.net/sansan52048/article/details/9160995
所以在涉及到文件操作的時候建議大家盡量用底層的FileStream操作。軟件就是這樣要不斷學習、不斷總結、不斷前進。
FileStream fs = info.Open(FileMode.OenOrCreate,
FileAccess.ReadWrite, FileShare.ReadWrite);
打開文件,取得文件流.
FileMode.OpenOrCreate(打開或者創建,如果指定文件存在就打開,否則創建)
FileAccess.ReadWrite(文件訪問權限,這裡表示可讀也可寫)
FileShare.ReadWrite(文件共享權限,同樣可讀可寫)
創建一個文件流對象fs,讀取程序根目錄下的a.txt文件。如果文件不存在,擇創建一個新文件。該流具有寫訪問權限,且在訪問過程中,如果有其他進程或者線程試圖訪問該文件,請求都將被拒絕。
建議你到msdn搜索資料,百度知道上提問.net函數,效率還是很低的。
以下為msdn資料地址。
msdn.microsoft.com/zh-cn/library/5h0z48dh.aspx