在C#中,如何复制具有任意编码的文件,逐行读取,而不添加或删除换行符

Dav*_*ers 1 c# encoding newline streamreader line-by-line

我需要能够获取具有未知编码的文本文件(例如,UTF-8,UTF-16,...)并逐行复制,随时进行特定更改.在这个例子中,我正在改变编码,但是这种处理还有其他用途.

我无法弄清楚的是如何确定最后一行是否有换行符!有些程序关心具有这些记录的文件之间的区别:

Rec1<newline>
Rec2<newline>
Run Code Online (Sandbox Code Playgroud)

和这些文件:

Rec1<newline>
Rec2
Run Code Online (Sandbox Code Playgroud)

如何区分我的代码以便我采取适当的措施?

using (StreamReader reader = new StreamReader(sourcePath))
using (StreamWriter writer = new StreamWriter(destinationPath, false, outputEncoding))
{
    bool isFirstLine = true;

    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();

        if (isFirstLine)
        {
            writer.Write(line);
            isFirstLine = false;
        }
        else
        {
            writer.Write("\r\n" + line);
        }
    }


    //if (LastLineHasNewline)
    //{
    //  writer.Write("\n");
    //}

    writer.Flush();
}
Run Code Online (Sandbox Code Playgroud)

注释掉的代码是我想要的,但我无法弄清楚如何设置条件lastInputLineHadNewline!请记住,我没有输入文件编码的先验知识.

Jon*_*eet 8

请记住,我没有输入文件编码的先验知识.

这是要解决的根本问题.

如果文件可以使用任何编码,那么就没有"逐行"读取的概念,因为你不可能知道行结尾是什么.

我建议你先解决这个问题,剩下的就很容易了.现在,在不知道上下文的情况下,很难说这是否意味着您应该要求用户进行编码,或者启发式地检测它或其他东西 - 但我不会在您完全理解之前开始尝试使用数据.