2010-10-07 5 views
7

У нас проблема с одним сервером, и это использование класса 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() перед близко без какой-либо помощи. Чем больше строк текста я пишу, тем больше происходит потеря данных.

+0

Не связано с вашей проблемой, но вызов Close является избыточным ... StreamWriter будет располагаться в конце используемого блока в любом случае –

+0

Да, обновил сообщение и удалил эту строку. Благодаря! –

+1

Никто не напишет такой метод ведения журнала. Он перезаписывает ранее зарегистрированные строки. Как выглядит код * на самом деле? –

ответ

1

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

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

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

После многократного поиска некоторых из нас, мы пришли к выводу, что это усечение вызвано включением сжатия для динамического контента для веб-сайта. Мы смогли воссоздать проблему усечения локально, и она исчезла, когда мы отключили сжатие. –

1

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

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

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

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

Я думал об этом же, но 'StreamWriter' очищает базовый поток в' Dispose'. –

+0

У меня такая же проблема, даже с использованием FileStream. –

3

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

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

Отличное решение для той же проблемы, что и у меня. Спасибо @Bonshington –

+0

Вы спасли мою жизнь :) спасибо – TMMDev

0

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

Вслед работал для меня

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

что здесь исправить? – user3800527

15

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

+0

Это исправило мою проблему отлично. Возможно, только что был установлен тот, который задал ОП. –

+0

Причина, по которой я исправил свою проблему: мой StreamWriter был замечен [поскольку его вызывающий пользователь вышел из сферы действия], прежде чем он смог закончить вывод своих последних нескольких строк. – bunkerdive

0

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

streamWriter.flush(); 
+0

Любое дополнительное объяснение улучшит ваш ответ. – ryanyuyu

0

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

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

Смежные вопросы