C#两个文件流写入文本文件,但只有一个影响文件

时间:2019-02-15 21:22:49

标签: c# filestream

下面的代码:

  var fs = new FileStream(@"C:\Users\Michał\Desktop\tools\test.txt", 
   FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

  var fs2 = new FileStream(@"C:\Users\Michał\Desktop\tools\test.txt", 
    FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);

        int a = 0;
        while (a < 3)
        {
            byte[] info = new UTF8Encoding(true).GetBytes("DEF_");
            byte[] info2 = new UTF8Encoding(true).GetBytes("abc_");
            fs.Write(info, 0, info.Length);
            Thread.Sleep(100);
            fs2.Write(info2, 0, info2.Length);
            Thread.Sleep(1000);

            ++a;
        }

        fs.Close();
        fs2.Close();

为什么结果是文件中只有“ abc_abc_abc”? FileShare.ReadWrite对我来说意味着其他进程/线程可以在FileStream ctor调用中同时写入此文件。

1 个答案:

答案 0 :(得分:0)

您可以实现所需的行为,如下所示:

using (var fs = new FileStream("test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
using (var fs2 = new FileStream("test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
    byte[] info = new UTF8Encoding(true).GetBytes("DEF_");
    byte[] info2 = new UTF8Encoding(true).GetBytes("abc_");

    for (int i = 0; i < 3; i++)
    {
        fs.Seek(0, SeekOrigin.End);
        fs.Write(info, 0, info.Length);
        fs.Flush();

        fs2.Seek(0, SeekOrigin.End);
        fs2.Write(info2, 0, info2.Length);
        fs2.Flush();
    }
}

在写入之前,流的每个指针必须位于末尾。这是使用Seek方法完成的。

写入后,您需要将缓冲区刷新到磁盘。这样可确保在开始下一次写入之前,流处于正确的状态。为此,请使用Flush方法。


在其构造函数中创建流时,可以指定FileOptions.WriteThrough。根据其描述,不应使用中间缓冲区。但是,如果没有Flush方法,它仍然无法工作。也许专家会解释原因。