FileStream锁定文件以读取和写入c#

前端之家收集整理的这篇文章主要介绍了FileStream锁定文件以读取和写入c#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码块让我头疼.

逻辑上它应该工作,因为我使用在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) 
{
    var sw = new StreamWriter(fs);
    sw.Write(str + text);
    sw.Flush();
    sw.Close();
}

我已经对线程做了一些假设,因此如果这不起作用或者向我们提供更多信息,您可能必须查找有关同步的信息.

另外,请提前关闭StreamReader(如果方法之前返回).使用后立即关闭它.

猜你在找的C#相关文章