2013-10-06 4 views
3

Я пытаюсь написать длинный список чисел в файл на C#, но он продолжает останавливаться до конца списка. Например, следующий код:System.IO.StreamWriter не пишет for for for for

System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt"); 

     for (int i = 0; i < 500; i++) 
     { 
      file.WriteLine(i); 
     } 

Оставляет меня с текстовым файлом с перечислением номеров 0 до 431. изменяющегося 500 до 1000 получает меня от 0 до 840. Это просто всегда кажется, перестать писать, прежде чем цикл закончен. Вывод чисел на консоль, а также файл успешно дает полный список в консоли, но не файл.

+1

Напоминание пользователям Windows: ** когда вы пишете потоки, не забудьте очистить **. Например, когда вы идете в ванную, и вы кладете/пишете вещи в туалет, вы тоже краснеете, верно? – Bitterblue

ответ

11

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

Один очень удобный способ сделать это с using заявление, которое гарантирует, что StreamWriter закрывается, как только ваш цикл выполняется с ним:

using (System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt")) 
{ 
    for (int i = 0; i < 500; i++) 
    { 
     file.WriteLine(i); 
    } 
} 
2

StreamWriter в буфер, то есть он не пишет в файл каждый раз, когда вы вызываете запись.

Поскольку вы не закрываете StreamWriter самостоятельно, вы полагаетесь на финализатор для того, чтобы объект сбросил оставшиеся байты, которые находятся в буфере.

Измените свой код, чтобы поместить StreamWriter внутри оператора using, и содержимое будет очищено, как только будет выведен блок использования.

4

Вы обнаружили, что StreamWriter использует буфер для вывода, длина которого составляет 4096 байтов. Этот буфер помогает сделать его более эффективным, сокращая количество вызовов, которые он вызывает в функции WriteFile() операционной системы. Чтобы содержимое буфера содержало его в файле, требуется вызвать метод Flush() или закрыть поток с помощью Close() или Dispose().

Если вы уверены, что вы хотите сохранить файл открыт, то вы можете добавить эту строку кода, чтобы убедиться, что вы можете увидеть результат, когда написано:

file.AutoFlush = true; 

Свойство AutoFlush по умолчанию false для файлов. Это true для консоли, поэтому вы можете сразу увидеть вывод Console.Write/Line(). Также одна из причин, почему вывод консоли настолько медленный.

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