C#中单独的编写器和读取器应用程序的文件共享

时间:2013-07-30 02:05:46

标签: c# fileshare

我有2个应用程序,一个是写入文件,另一个是读取文件。它是一个日志文件,因此编写器将记录直到程序停止,而读者可以随时调用以获取文件的内容。

我认为当编写者使用FileShare.Read打开文件时,阅读器将能够访问该文件,但它会产生错误,说明该文件正由另一个进程使用。

作家申请:

FileStream fs = new FileStream(“file.log”,FileMode.Open,FileAccess.Write,FileShare.Read); BinaryWriter writer = new BinaryWriter(fs);

读者申请:

BinaryReader reader = new BinaryReader(File.OpenRead(“file.log”));

如何防止此错误?

2 个答案:

答案 0 :(得分:0)

您是否可以在阅读文件的同时尝试指定FileShare.Read?而不是直接使用File.OpenRead使用FileStream具有此权限。

此外,对于日志记录,您可以使用log4Net或任何其他免费日志记录框架来管理日志记录,我们无需管理文件写入。

答案 1 :(得分:0)

o读取一个锁定文件,您需要为FileStream提供更多标志。

如下所示的代码。

using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read,FileShare.ReadWrite))
{
            using (var binary = new BinaryReader(reader))
            {
                //todo: add your code
                binary.Close();
            }
            reader.Close();
}

这将打开文件以便仅以读写共享模式进行读取。这可以使用小应用程序进行测试。 (使用streamreader \ write而不是binary)

    static Thread writer,
                  reader;

    static bool abort = false;

    static void Main(string[] args)
    {

        var fs = File.Create("D:\\test.txt");
        fs.Dispose();

        writer = new Thread(new ThreadStart(testWriteLoop));
        reader = new Thread(new ThreadStart(testReadLoop));
        writer.Start();
        reader.Start();

        Console.ReadKey();
        abort = true;
    }

    static void testWriteLoop()
    {
        using (FileStream fs = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Write, FileShare.Read))
        {
            using (var writer = new StreamWriter(fs))
            {
                while (!abort)
                {
                    writer.WriteLine(DateTime.Now.ToString());
                    writer.Flush();
                    Thread.Sleep(1000);
                }
            }
        }
    }

    static void testReadLoop()
    {
        while (!abort)
        {
            Thread.Sleep(1000);
            using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var stream = new StreamReader(reader))
                {
                    Console.WriteLine(stream.ReadToEnd());
                    stream.Close();

                }
                reader.Close();
            }
        }
    }

我意识到上面的例子非常简单,但事实仍然是“testWriteLoop”永远不会释放锁。

希望这有帮助