[英]FileStream locking a file for reading and writing
我有以下代碼塊讓我頭疼。
從邏輯上講,它應該可以工作,因為我正在使用在 using 語句中提供鎖的文件流。 當它到達創建 StreamWriter 的行時,它沒有說“文件不可寫”。
現在我的程序是一個多線程應用程序。 任何線程都可能試圖寫入此文件。 我需要程序來鎖定文件、讀取內容、檢查內容,然后寫回任何更改。 在該過程中,沒有其他線程應該能夠訪問該文件。
using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
var sr = new StreamReader(fs);
var str = sr.ReadToEnd();
var strArray = str.Split(',');
if (strArray.Any(st => st == text))
{
return;
}
sr.Close();
var sw = new StreamWriter(fs);
sw.Write(str + text);
sw.Flush();
sw.Close();
}
FileShare.None 標志不會導致線程排隊,它只是鎖定文件,因此您會得到異常。 要提供互斥訪問,您可以在寫入之前鎖定共享對象。
但是你說“現在我的程序是一個多線程應用程序。任何線程都可能試圖寫入這個文件。” 現在,這些線程是否都使用完全相同的方法寫入文件? 讓我們假設他們這樣做,那么這應該有效......
創建一個靜態類變量...
private static object lockObject = new object();
在這里使用它...
lock (lockObject)
{
using(var sw = new StreamWriter(fs))
{
sw.Write(str + text);
}
}
我對線程做了一些假設,因此如果這不起作用,您可能需要查找有關同步的信息或向我們提供更多信息。
另外,請提前關閉您的StreamReader
(以防該方法提前返回)。 使用后立即關閉它,或者最好使用using
。
嘗試線程同步。 您可以從此鏈接找到更多詳細信息。
如在MSDN 中引用Close 方法
關閉 StreamReader 對象和底層流,並釋放與讀取器關聯的任何系統資源。
因此,對 StreamWriter 的后續調用似乎無法使用已關閉的資源,從而為您提供消息“文件不可寫”。
試試這個
using (var fs = File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
using (var sr = new StreamReader(fs))
{
var str = sr.ReadToEnd();
// ...
using (var sw = new StreamWriter(fs))
{
// ...
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.