FileStream锁定文件以读取和写入c#
发布时间:2020-12-15 04:04:51 所属栏目:百科 来源:网络整理
导读:我有以下代码块让我头疼. 逻辑上它应该工作,因为我使用在using语句中提供锁的文件流.当它到达创建StreamWriter的行时,它无法说“文件不可写”. 现在我的程序是一个多线程应用程序.任何线程都可能尝试写入此文件.我需要程序来锁定文件,读取内容,检查内容,然后
我有以下代码块让我头疼.
逻辑上它应该工作,因为我使用在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(如果方法之前返回).使用后立即关闭它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |