2

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

共享访问的问题是,如果我使用“附加”,它似乎不起作用。
锁定文件的问题是我无法事先知道它将锁定哪个文件,因为它们是随机选择的。

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

谢谢

4

1 回答 1

1

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

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

于 2013-09-09T07:52:45.930 回答