C# BinaryWriter не пишет в файл - PullRequest
       21

C# BinaryWriter не пишет в файл

2 голосов
/ 26 февраля 2020

Я пытаюсь записать файлы данных на диск, чтобы я мог кэшировать большие объемы данных, которые не помещаются в память. В некоторых ранних тестах я обнаружил, что иногда я получаю записанные данные, а иногда нет. Вот пример, показывающий, что процесс не работает:

using System.IO;
using System;


namespace TestBinaryWriter
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            double dFoo = 1234.1234;
            BinaryWriter bw = new BinaryWriter(File.OpenWrite("asdf"));
            bw.Write(dFoo);
            bw.Write(BitConverter.GetBytes(dFoo));
        }
    }
}

Содержимое файла asdf пустое, и я не понимаю, почему.

Ответы [ 3 ]

5 голосов
/ 26 февраля 2020

Инициализируйте и используйте BinaryWriter при использовании блока:

using (BinaryWriter bw = new BinaryWriter(File.OpenWrite("asdf"))
{
    bw.Write(dFoo);
    bw.Write(BitConverter.GetBytes(dFoo));
}

Что было неверным в вашей реализации, так это то, что поток не был закрыт (вызывая метод close) и содержимое не было должным образом сброшено в файл .

С оператором using он автоматически вызовет метод Dispose. В реализации Dispose вызывается Close. Вот как это работает.

4 голосов
/ 26 февраля 2020

BinaryWriter кэширует данные для записи данных в файл, который вы должны сделать явно

  ...
  bw.Write(dFoo);
  bw.Flush(); // <- write all the data (dFoo) down
  ...

или Close (Dispose) писатель. Типичный шаблон using:

{
  ...

  // bw will be closed on leaving its scope  
  using BinaryWriter bw = new BinaryWriter(File.OpenWrite("asdf"));

  bw.Write(dFoo);
  bw.Write(BitConverter.GetBytes(dFoo));
  ...
} // bw will be closed here (with all data cached being written)

или

  using (BinaryWriter bw = new BinaryWriter(File.OpenWrite("asdf"))) {
    bw.Write(dFoo);
    bw.Write(BitConverter.GetBytes(dFoo)); 
  } // bw will be closed here (with all data cached being written)
1 голос
/ 26 февраля 2020

Попробуйте включить объявление и использование переменной bw в инструкцию using, чтобы она автоматически удалялась (и, следовательно, сбрасывалась) перед выходом из программы.

...