Подтвердить что ты не робот

Эффективный способ объединения нескольких текстовых файлов

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

4b9b3361

Ответ 1

Сделайте это в кусках:

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

Ответ 2

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

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

Ответ 3

Это код, используемый выше для .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());
    }
  }
}

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