StreamWriter не записывает последние несколько символов в файл - PullRequest
9 голосов
/ 07 октября 2010

У нас проблема с одним сервером, и он использует класс StreamWriter.Кто-нибудь испытывал что-то похожее на проблему ниже?Если да, что было решением для устранения проблемы?

  using( StreamWriter logWriter = File.CreateText( logFileName ) )
  {
    for (int i = 0; i < 500; i++)
      logWriter.WriteLine( "Process completed successfully." );
  } 

При записи файла генерируется следующий вывод:

  Process completed successfully.
  ...  (497 more lines)
  Process completed successfully.
  Process completed s

Попытка добавления logWriter.Flush () перед закрытиембез посторонней помощи.Чем больше строк текста я напишу, тем больше будет потеря данных.

Ответы [ 7 ]

16 голосов
/ 05 марта 2013

У меня была очень похожая проблема.Я обнаружил, что если я включил автозапуск перед выполнением любых записей в поток, и он начал работать, как ожидалось.logWriter.AutoFlush = true;

3 голосов
/ 12 октября 2010

иногда даже вы вызываете flush (), он просто не работает.Потому что Flush () заставит поток записывать большую часть данных в потоке, кроме последнего блока его буфера.

try
{
 // ... write method
 // i dont recommend use 'using' for unmanaged resource
}
finally
{
 stream.Flush();
 stream.Close();
 stream.Dispose();
}
1 голос
/ 07 октября 2010

Это, безусловно, проблема для меня, хотя вы говорите, что добавили вызов Flush ().Проблема может заключаться в том, что ваш StreamWriter является просто оболочкой для базового объекта FileStream.

Обычно я не использую метод File.CreateText для создания потока для записи в файл;Я обычно создаю свой собственный FileStream, а затем при желании оборачиваю его StreamWriter.Несмотря на это, я сталкивался с ситуациями, когда мне нужно было вызывать Flush как для StreamWriter, так и для FileStream, поэтому я думаю, что это ваша проблема.

Попробуйте добавить следующий код:

            logWriter.Flush();
            if (logWriter.BaseStream != null)
                logWriter.BaseStream.Flush();
1 голос
/ 07 октября 2010

Невозможно воспроизвести это.

В нормальных условиях это не должно и не подведет.

  • Это действительный код, который не работает? Текст «Процесс завершен» предполагает, что это выдержка.
  • Какие-либо потоки вовлечены?
  • Сетевой диск или локальный?
  • и т.д..
0 голосов
/ 20 февраля 2018

Использование фреймворка 4.6.1 и в условиях сильного стресса все еще имеет эту проблему. Я не уверен, почему это происходит, хотя я нашел способ решить это совсем по-другому (что усиливает мое чувство, что это действительно ошибка .net).

В моем случае я попытался записать огромные неровные массивы на диск (видео кеширование). Поскольку зубчатый массив достаточно велик, для хранения большого набора видеокадров приходилось выполнять многократные записи, и, несмотря на то, что они были несжатыми, а каждый кэш-файл получал ровно 1000 кадров, зарегистрированные файлы наличных имели все разные размеры.

У меня была проблема, когда я использовал это

//note, generateLogfileName is just a function to create a filename()

using (FileStream fs = new FileStream(generateLogfileName(), FileMode.OpenOrCreate))
{
  using (StreamWriter sw = new StreamWriter(fs)
  {
    // do your stuff, but it will be unreliable
  }
}

Однако, когда я указал тип кодирования, все зарегистрированные файлы получили одинаковый размер, и проблема исчезла.

using (FileStream fs = new FileStream(generateLogfileName(), FileMode.OpenOrCreate))
  {
    using (StreamWriter sw = new StreamWriter(fs,Encoding.Unicode))
    {
      // all data written correctly,  no data lost.
    }
 }

Обратите внимание также на ширину файла одинакового типа кодировки!

0 голосов
/ 10 июня 2015

Это помогло мне:

streamWriter.flush();
0 голосов
/ 30 мая 2012

Я столкнулся с той же проблемой

Следующее сработало для меня

using (StreamWriter tw = new StreamWriter(@"D:\Users\asbalach\Desktop\NaturalOrder\NatOrd.txt"))
{
    tw.Write(abc.ToString());// + Environment.NewLine);
}
...