程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> FileStream 的FileShare一點小認識,fileshare

FileStream 的FileShare一點小認識,fileshare

編輯:C#入門知識

FileStream 的FileShare一點小認識,fileshare


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(文件共享權限,同樣可讀可寫)
 

filestream fs=new filestream(“atxt”,filemodecreatenew,fileaccesswrite,filesharenone

創建一個文件流對象fs,讀取程序根目錄下的a.txt文件。如果文件不存在,擇創建一個新文件。該流具有寫訪問權限,且在訪問過程中,如果有其他進程或者線程試圖訪問該文件,請求都將被拒絕。
建議你到msdn搜索資料,百度知道上提問.net函數,效率還是很低的。
以下為msdn資料地址。
msdn.microsoft.com/zh-cn/library/5h0z48dh.aspx
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved