我有多个文本文件需要阅读并合并到一个文件中。
这些文件大小不一:每个1到50 MB。
什么是最有效的方法来组合这些文件而不会陷入恐惧System.OutofMemoryException
?
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:22)
using (var output = File.Create("output"))
{
foreach (var file in new[] { "file1", "file2" })
{
using (var input = File.OpenRead(file))
{
input.CopyTo(output);
}
}
}
答案 2 :(得分:0)
这是上面用于.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());
}
}
}
请注意,这将立即读取内存中的整个文件。这意味着大文件将导致大量内存被使用(如果没有足够的内存可用,它可能会一起失败)。