在被另一个线程追加时读取文件

时间:2013-09-09 07:39:31

标签: c# file file-io

我正在使用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;
            }
        }

Share访问的问题是,如果我使用'Append',它似乎不起作用 锁定文件的问题在于,我无法事先知道它将随机选择锁定哪个文件。

在我重新设计我的代码之前,我想我会看到是否有人对如何解决这个问题有一个聪明的想法。

感谢

1 个答案:

答案 0 :(得分:1)

在您的编写器代码中,使用FileShare.Read打开,并且在您的阅读器中可以使用FileShare.ReadWrite就足够了。

您是否尝试过简化测试?只需创建2个文件流实例。 1执行写入操作,然后在保持文件打开的同时创建第二个文件流,在同一文件上执行读取操作。然后,您可以验证您的共享是否正确。