【问题标题】:Why is StreamWriter adding in an extra blank line while File.WriteAllLine does not?为什么 StreamWriter 添加一个额外的空行而 File.WriteAllLines 没有?
【发布时间】:2015-07-12 22:20:23
【问题描述】:

我最初使用 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"

不幸的是,这并没有解决问题。对此问题的任何帮助或建议将不胜感激。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    那是因为:

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

    【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多