【问题标题】:How to add CRLF (Environment.NewLine) to FileStream correctly?如何正确将 CRLF (Environment.NewLine) 添加到 FileStream?
【发布时间】:2014-06-13 03:49:13
【问题描述】:

我在 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);
        }
    }
}

我可以在记事本或其他文本编辑器中毫无问题地打开 TargetFile.txt,并且我可以看到我的所有文本都完美呈现,除了我要添加的额外新行...我在做什么错了吗?

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

【问题讨论】:

  • 你试过UTF8编码吗?
  • @MatíasFidemraizer 是的...我只是尝试了相同的结果...
  • 而且,您是否尝试只写换行符并看看会发生什么?我的意思是,用 1 个换行符编写一个文件。
  • 如果你用StreamWriter 包裹你的FileStream,你可以打电话给StreamWriter.WriteLine()
  • 非常感谢您的建议!只需按照 hvd 的回答中的建议更改代码以使用 'Encoding.Unicode' 确实有效!

标签: c# bytearray text-files newline filestream


【解决方案1】:

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

请注意,文本文件没有固定的编码,因此Encoding.Default 错误此处这一事实并不会导致任何地方都错误。准备好处理不同编码的文件。

【讨论】:

  • 看准了!使用“Encoding.Unicode”可以解决问题(所有正在读取的源文件都使用 Little-Endian 编码),非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-22
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多