c # Два FileStreams записывают в текстовый файл, но только один файл влияет - PullRequest
0 голосов
/ 16 февраля 2019

ниже кода:

  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 голосов
/ 16 февраля 2019

Вы можете добиться желаемого поведения следующим образом:

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.Возможно, эксперты объяснят причину.

...