微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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(如果方法之前返回).使用后立即关闭它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐