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

17

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

    
задан Dave Harding 10.06.2011 в 21:47
источник

3 ответа

22

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

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);
            }
        }
    }
}
    
ответ дан Darin Dimitrov 10.06.2011 в 21:50
источник
20

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

using (var output = File.Create("output"))
{
    foreach (var file in new[] { "file1", "file2" })
    {
        using (var input = File.OpenRead(file))
        {
            input.CopyTo(output);
        }
    }
}
    
ответ дан n8wrl 10.06.2011 в 21:54
источник
-1

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

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

ответ дан user2606127 22.07.2013 в 10:45
источник