Эффективный способ объединить несколько текстовых файлов - PullRequest
17 голосов
/ 10 июня 2011

У меня есть несколько файлов текста, которые мне нужно прочитать и объединить в один файл. Файлы имеют разный размер: 1 - 50 МБ каждый. Какой самый эффективный способ объединить эти файлы, не сталкиваясь с ужасом System.OutofMemoryException?

Ответы [ 3 ]

22 голосов
/ 10 июня 2011

Дарин на правильном пути.Мой твик будет:

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}
22 голосов
/ 10 июня 2011

Делайте это кусками:

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);
            }
        }
    }
}
0 голосов
/ 22 июля 2013

Этот код используется выше для .Net 4.0, но совместим с .Net 2.0 (для текстовых файлов)

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());
    }
  }
}

Обратите внимание, что при этом будет прочитан весь файл в памяти одновременно. Это означает, что большие файлы приведут к использованию большого количества памяти (и если недостаточно памяти, это может привести к сбою всего вместе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...