У меня есть несколько файлов текста, которые мне нужно прочитать и объединить в один файл.
Файлы имеют разный размер: 1 - 50 МБ каждый.
Какой самый эффективный способ объединить эти файлы, не нападая на страх System.OutofMemoryException
?
Эффективный способ объединения нескольких текстовых файлов
Ответ 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());
}
}
}
Обратите внимание, что это сразу прочитает весь файл в памяти. Это означает, что большие файлы будут использовать много памяти (и если недостаточно памяти, она может не работать вместе).