StreamWriter не записывает последние несколько символов в файл

у нас проблема с одним сервером, и это использование класса 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 ответов


не удается воспроизвести это.

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

  • это фактический код, который не выполняется ? Текст "процесс завершен" предполагает, что это выдержка.
  • любой резьбы?
  • сетевой диск или локальный?
  • etc.

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


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

try
{
 // ... write method
 // i dont recommend use 'using' for unmanaged resource
}
finally
{
 stream.Flush();
 stream.Close();
 stream.Dispose();
}

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

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

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

            logWriter.Flush();
            if (logWriter.BaseStream != null)
                logWriter.BaseStream.Flush();

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

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

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

Это сделал трюк для меня:

streamWriter.flush();

использование фреймворка 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.
    }
 }

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