2015-05-03 5 views
0

Я изначально использовал File.WriteAllLines, чтобы выписать большой список записей в локальный текстовый файл. Этот список настроен на расширение, поэтому, чтобы избежать проблем с памятью, я решил следовать рекомендациям, приведенным в SqlClient Streaming Support MSDN Article. Измененный код, который я использую в настоящее время, приведен ниже.Почему StreamWriter добавляет лишнюю пустую строку, а File.WriteAllLine - нет?

using (FileStream destFile = new FileStream(
         destinationFilePath, FileMode.Create, FileAccess.Write)) 
      { 
       using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess)) 
       { 
        using (StreamWriter writer = new StreamWriter(destFile)) 
        { 
        while (await reader.ReadAsync()) 
        { 
         char[] buffer = new char[4096]; 
         int charsRead = 0; 
         using (TextReader data = reader.GetTextReader(0)) 
         { 
           do 
           { 
            charsRead = await data.ReadAsync(buffer, 0, buffer.Length); 
            await writer.WriteLineAsync(buffer, 0, charsRead); 
           } 
           while (charsRead > 0); 
          } 
         } 
        } 
       } 
      } 

Файл, который создается в результате выполнения этого кода (с использованием writer.WriteLineAsync) включает в себя нежелательную пустую строку между каждой записью, несмотря на то, выводятся данные верны. Первоначально я использовал SqlQuery method вместе с циклом foreach и добавил каждую запись в общую коллекцию. Затем я использовал File.WriteAllLines для вывода записей в указанный файл, а записи были отформатированы без пустых строк между ними (желаемый результат).

, чтобы попытаться решить эту проблему (вместо использования writer.WriteLineAsync), я тогда пытался использовать

writer.WriteAsync 

но весь текст был выведен в один ряд.

Я исследовал StackOverflow некоторые советы и наткнулся на сообщения, предполагающие использование

writer.NewLine ="\n\r" or writer.NewLine ="\r" 

это, к сожалению, не решить эту проблему. Любая помощь или совет будут высоко оценены по этому вопросу. Заранее спасибо.

ответ

2

Именно из-за этого:

charsRead = await data.ReadAsync(buffer, 0, buffer.Length); 
await writer.WriteLineAsync(buffer, 0, charsRead); 

Когда charsRead является 0, вы пропишите строку. Измените его на

charsRead = await data.ReadAsync(buffer, 0, buffer.Length); 
if (charsRead > 0) 
    await writer.WriteLineAsync(buffer, 0, charsRead); 

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

do 
{ 
    charsRead = await data.ReadAsync(buffer, 0, buffer.Length); 
    if (charsRead > 0) 
     await writer.WriteAsync(buffer, 0, charsRead); 
} 
while (charsRead > 0); 
await writer.WriteLineAsync(buffer, 0, 0); 
+0

Спасибо много Алекс. теперь работает. –

+0

@JohnMack Я рад, что сработал для вас. Вы можете принять его как ответ, установив галочку рядом с этим ответом, чтобы разрешить удаление вашего вопроса из списка «неотвеченные вопросы». См. [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – Alex

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