如何正确地将CRLF(Environment.NewLine)添加到FileStream?

时间:2014-04-27 17:50:44

标签: c# bytearray text-files newline filestream

我正在将多个文本文件合并到C#中的单个文本文件中,并且我正在使用字节数组进行分块...这部分对我有用。但是现在我想在新文本文件合并到我的目标文本文件之前添加一个新行。我在不同的线程上发现使用下面的代码应该让我添加一个新行,但由于某种原因,我的文本文件中的最终输出是一个小块(਍)而不是一个新行。

有问题的代码:

byte[] newLine = Encoding.Default.GetBytes(Environment.NewLine);
output.Write(newLine, 0, newLine.Length);

合并文本文件的代码的完整部分:

int chunkSize = 3 * 1024; // 3KB

using (FileStream output = File.Create(outputFolder + @"\TargetFile.txt"))
{
    foreach (string text in textFiles)
    {
        using (FileStream input = File.OpenRead(text))
        {
            byte[] buffer = new byte[chunkSize];
            int bytesRead;
            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                output.Write(buffer, 0, bytesRead);
            }

            byte[] newLine = Encoding.Default.GetBytes(Environment.NewLine);
            output.Write(newLine, 0, newLine.Length);
        }
    }
}

我可以在NotePad或其他文本编辑器中打开TargetFile.txt没有任何问题,我能够看到我的所有文本完美呈现,除了我想添加的其他新行...我在做什么错?

注意:在我的代码示例中,我使用的是Encoding.Default,但我也尝试使用Encoding.ASCII,结果完全相同。

1 个答案:

答案 0 :(得分:3)

有问题的字符是U + 0A0D,实际上它不是有效字符。你想要U + 000D,然后是U + 000A,你得到U + 0A0D的事实表明文本文件使用16位小端Unicode编码,所以Encoding.DefaultEncoding.ASCIIEncoding.UTF8都错了。 Encoding.Unicode更可能是正确的。

请注意,文本文件没有固定的编码,因此Encoding.Default错误此处的事实并没有错误无处不在。准备好处理具有不同编码的文件。