有一個txt檔案,被一個C++寫的程式如此打開,更新內容:
FILE *fp = fopen("a.txt", "w");
另一支python程式,也會短暫打開快速讀取一行,代碼更簡單,如下:
fp= open("a.txt", "r")
fp.readline();
fp.close();
現在我用C#寫了一個console程式,
using (StreamReader sr = new StreamReader(”a.txt"))
{
sr.ReadLine();
}
現在問題是,這支C#程式,執行到using 那一行時,構造streamreader報錯,提示:打開a.txt時有例外,因為正被其他行程打開!
錯誤資訊截屏如圖。

按說,C#中只是只讀打開,而且C++程式 與 python 中打開檔案,也沒有指定是獨占打開,所以應該打開沒問題啊。
而且,事實上,python 程式類似的打開與讀取,都運行正常。
為什么C#代碼中,就打不開呢?
看到C#檔案中提到,FileStream 類有個屬性 FileShare, 可以指定是否獨占打開。
可是,此處的C#代碼中,用的是StreamReader類,沒有這個屬性;
而C++代碼中與Python代碼中,也只是簡單的fopen/open,應該也是非獨占吧。
所以,如何查看,究竟是誰在打開這個txt呢?為什么C#代碼中就打不來讀取呢?
請高手同學賜教賜教。謝謝。預祝大家新春愉快!
uj5u.com熱心網友回復:
WhoLockMe 這個軟體看下uj5u.com熱心網友回復:
共享控制的目的是為了安全。假設有如下共享情形:A B
-----------
一 讀 讀
二 讀 寫
三 寫 寫
很明顯,情形一是安全的,多個讀者不會互相影響。
很明顯,情形三是不安全的,多個寫將會互踩腳趾頭;
但情形二呢?
答案是情形二也是不安全的,由于B的寫操作(可以是任何地方的寫入),A不能安全的按他的邏輯進行讀操作。
如果A明知不安全,明知可能會臟讀,還要進行讀操作。那么在DotNet下,
1、B要允許其他人讀,至少要FileShare.Read共享
2、A要認可不安全操作,同意FileShare.ReadWrite。
var A = new StreamWriter(filename); // 共享默認為FileShare.Read[注一],允許他人臟讀。
var B = new StreamReader(filename); // 共享默認為FileShare.Read[注二],不認可臟讀,失敗。
var A = new StreamWriter(filename);
var B = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); // 認可臟讀,成功。
至于為什么python程式可以讀,具體你還要看說明檔案和具體實作。
比如fopen可能會呼叫_fsopen,_fsopen用shflag指定共享模式。
【注一:】
StreamWriter源代碼(目前第226行)
https://referencesource.microsoft.com/#mscorlib/system/io/streamwriter.cs
【注二:】
StreamReader源代碼(目前第240行)
https://referencesource.microsoft.com/#mscorlib/system/io/streamreader.cs
uj5u.com熱心網友回復:
檔案 Read 默認是獨占的。你需要設定為共享打開。uj5u.com熱心網友回復:
用streamreader(FileStream)創建類,引數使用File.Open(string, mode,Access, share)來創建FileStream,mode用open,Access用read,share用readwrite試試?uj5u.com熱心網友回復:
Windows官方的檔案讀寫共享的兼容表格可以參閱:
https://docs.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files
第一個打開檔案的方式 合法的第二個打開方式
GENERIC_WRITE, FILE_SHARE_READ GENERIC_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE
...
uj5u.com熱心網友回復:
那你們一般是用允許臟讀的還是不允許臟讀的寫法呢轉載請註明出處,本文鏈接:https://www.uj5u.com/net/73213.html
標籤:C#
