为什么StreamWriter在File.WriteAllLine中没有添加额外的空行?

时间:2015-05-03 14:07:16

标签: c# .net file-io streaming streamwriter

我最初使用File.WriteAllLines将大量记录写入本地文本文件。此列表设置为展开,因此为了避免任何内存问题,我决定遵循 SqlClient Streaming Support MSDN Article 中给出的建议。我目前使用的更改代码包含在下面。

  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"

遗憾的是,这并没有解决问题。在这个问题上,我们将非常感谢任何帮助或建议。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是因为:

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

每当charsRead0时,您仍然会写一行。将其更改为

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);