读取文件,同时被另一个线程追加
本文关键字:另一个 线程 追加 文件 读取 | 更新日期: 2023-09-27 18:30:41
我正在使用C#。为了说明我的问题,我在WinForms桌面应用程序上将其简化为2个计时器。
第一个计时器随机选择一个现有的文本文件,打开它进行追加,并在它的末尾写入一个字符串。 然后关闭。
每隔几毫秒(左右)重复调用此过程。
另一个计时器也将随机选择一个文件并尝试读取它。此过程也每毫秒重复调用一次。
最终,两个计时器都解决了同一个文件,我得到了锁定错误。
现在我使用以下代码行附加到文件:
using (FileStream stream = new FileStream(_folder + "''manifest.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
TextWriter newWriter = new StreamWriter(stream);
newWriter.WriteLine(_timestamp);
newWriter.Flush();
newWriter.Close();
}
我使用以下代码行读取文件:
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 0x1000, FileOptions.SequentialScan))
using (var sr = new StreamReader(fs, Encoding.UTF8))
{
string line;
while ((line = sr.ReadLine()) != null)
{
yield return line;
}
}
共享访问权限的问题在于,如果我使用"追加",它似乎不起作用。
锁定文件的问题在于,由于它们是随机选择的,因此我无法事先知道它将锁定哪个文件。
在我考虑为此重新设计我的代码之前,我想我会看看是否有人对如何解决这个问题有一个聪明的想法。
谢谢
在你的编写器代码中,用FileShare.Read打开,在你的阅读器中,使用FileShare.ReadWrite应该就足够了。
您是否尝试过简化测试。只需创建 2 个文件流实例。1 执行写入操作,然后在保持文件打开状态的同时创建第二个文件流,用于对同一文件执行读取。然后,您可以验证您的共享是否正确。