C# 组合多个文本文件的有效方法

C# 组合多个文本文件的有效方法,c#,performance,concatenation,C#,Performance,Concatenation,我有多个文本文件,我需要阅读并合并成一个文件。 这些文件大小不一:每个1-50MB。 组合这些文件而不碰到可怕的系统的最有效方法是什么。OutofMemoryException?分块执行: const int chunkSize = 2 * 1024; // 2KB var inputFiles = new[] { "file1.dat", "file2.dat", "file3.dat" }; using (var output = File.Create("output.dat")) {

我有多个文本文件,我需要阅读并合并成一个文件。 这些文件大小不一:每个1-50MB。 组合这些文件而不碰到可怕的
系统的最有效方法是什么。OutofMemoryException

分块执行:

const int chunkSize = 2 * 1024; // 2KB
var inputFiles = new[] { "file1.dat", "file2.dat", "file3.dat" };
using (var output = File.Create("output.dat"))
{
    foreach (var file in inputFiles)
    {
        using (var input = File.OpenRead(file))
        {
            var buffer = new byte[chunkSize];
            int bytesRead;
            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                output.Write(buffer, 0, bytesRead);
            }
        }
    }
}

达林走上了正确的道路。我的建议是:

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}

这是上面用于.Net 4.0的代码,但与.Net 2.0兼容(用于文本文件)


请注意,这将一次性读取内存中的整个文件。这意味着大文件将导致大量内存被使用(如果没有足够的可用内存,它可能会一起失败)

你能描述一下“联合收割机”吗?那些文件里有什么?只是一行行文本、CSV或XML,或者……您需要做什么样的组合?如果你只是,比方说,对一堆排序过的文件进行合并排序,你不需要将整个文件读入内存,只需要逐行处理它们。。。复制file1.txt+file2.txt+file3.txt allfiles.txt
copy*.txt allfiles.txt
我要去参加一个会议,可能有一点无法测试,但我会尽快给你回复感谢重复的重新分配和数据复制到,
actual
是多余的。只需将已知的字节数(按
字节读取
)直接从
缓冲区
写入新文件即可<代码>缓冲区本身也只需要分配一次,然后才能进入外部
循环。@Steve Townsend,很好的观点。我已经更新了我的帖子以考虑到这一点。达林,谢谢。非常感谢。10个文件,它甚至不费吹灰之力。@DarinDimitrov这也处理unicode文件吗?如果两个文件的格式不同怎么办?
CopyTo
是一个不错的格式,但可能值得一提的是,它仅在.NET 4.0.ooo中可用-现在没有。我的MSDN默认为.NET 4我们如何从组合文件中取回文件?@Carter:你能澄清一下吗?原始文件仍然存在,在我的例子中,我有两个文件“file.Docx”和“file_Information.Xml”,例如,我希望应用程序A将这两个文件合并到一个文件“file.QAF”。。。然后将此文件传递给另一个应用程序B,以恢复两个文件“file.Docx”和“file_Information.Xml”(返回…)-1:这对大文件不起作用(因为
ReadToEnd()
将在内存中创建一个字符串。
using (var output = new StreamWriter("D:\\TMP\\output"))
{
  foreach (var file in Directory.GetFiles("D:\\TMP", "*.*"))
  {
    using (var input = new StreamReader(file))
    {
      output.WriteLine(input.ReadToEnd());
    }
  }
}