如何读取多个文本文件并将其保存到一个文本文件中?

Iva*_*nov 1 c# text file

在我的情况下,我有五个巨大的文本文件,我必须嵌入到一个文本文件中.

我尝试使用StreamReader(),但我不知道如何使它再读一个文件,我是否必须分配另一个变量?

展示一个例子将非常感激.

Jon*_*eet 8

新答案

(请参阅下面的解释原始答案.)

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        // Somewhat arbitrary limit, but it won't go on the large object heap
        char[] buffer = new char[16 * 1024]; 
        foreach (string source in sources)
        {
            using (TextReader reader = File.OpenText(source))
            {
                int charsRead;
                while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    writer.Write(buffer, 0, charsRead);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个新答案很像Martin的方法,除了:

  • 它读入较小的缓冲区; 16K在几乎所有情况下都是可以接受的,并且不会最终出现在大对象堆上(不会被压缩)
  • 它读取文本数据而不是二进制数据,原因有两个:
    • 可以轻松修改代码以从一种编码转换为另一种编码
    • 如果每个输入文件包含一个字节顺序标记,读取器将跳过该标记,而不是以输入文件边界处输出文件中散布的字节顺序标记结束

原始答案

Martin Stettner在下面的答案中指出了一个问题 - 如果第一个文件没有换行结束,它仍会在输出文件中创建换行符.此外,它会将换行符转换为"\ r \n",即使它们之前只是"\ r"或"\n".最后,对于长线使用大量数据存在毫无意义的风险.

就像是:

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        foreach (string source in sources)
        {
            using (TextReader reader = File.OpenText(source))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    writer.WriteLine(line);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这会逐行读取,以避免一次读入太多内存.如果您乐意将每个文件完全读入内存(仍然是一次一个),您可以更简单:

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        foreach (string source in sources)
        {
            string text = File.ReadAllText(source);
            writer.Write(text);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)