簡體   English   中英

FileStream 鎖定文件以進行讀寫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM