C# 组合多个文本文件的有效方法
我有多个文本文件,我需要阅读并合并成一个文件。 这些文件大小不一:每个1-50MB。 组合这些文件而不碰到可怕的C# 组合多个文本文件的有效方法,c#,performance,concatenation,C#,Performance,Concatenation,我有多个文本文件,我需要阅读并合并成一个文件。 这些文件大小不一:每个1-50MB。 组合这些文件而不碰到可怕的系统的最有效方法是什么。OutofMemoryException?分块执行: const int chunkSize = 2 * 1024; // 2KB var inputFiles = new[] { "file1.dat", "file2.dat", "file3.dat" }; using (var output = File.Create("output.dat")) {
系统的最有效方法是什么。OutofMemoryException
?分块执行:
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);
}
}
}
}
达林走上了正确的道路。我的建议是:
using (var output = File.Create("output"))
{
foreach (var file in new[] { "file1", "file2" })
{
using (var input = File.OpenRead(file))
{
input.CopyTo(output);
}
}
}
这是上面用于.Net 4.0的代码,但与.Net 2.0兼容(用于文本文件)
请注意,这将一次性读取内存中的整个文件。这意味着大文件将导致大量内存被使用(如果没有足够的可用内存,它可能会一起失败) 你能描述一下“联合收割机”吗?那些文件里有什么?只是一行行文本、CSV或XML,或者……您需要做什么样的组合?如果你只是,比方说,对一堆排序过的文件进行合并排序,你不需要将整个文件读入内存,只需要逐行处理它们。。。复制file1.txt+file2.txt+file3.txt allfiles.txt
copy*.txt allfiles.txt
我要去参加一个会议,可能有一点无法测试,但我会尽快给你回复感谢重复的重新分配和数据复制到,actual
是多余的。只需将已知的字节数(按字节读取
)直接从缓冲区
写入新文件即可<代码>缓冲区本身也只需要分配一次,然后才能进入外部循环。@Steve Townsend,很好的观点。我已经更新了我的帖子以考虑到这一点。达林,谢谢。非常感谢。10个文件,它甚至不费吹灰之力。@DarinDimitrov这也处理unicode文件吗?如果两个文件的格式不同怎么办?CopyTo
是一个不错的格式,但可能值得一提的是,它仅在.NET 4.0.ooo中可用-现在没有。我的MSDN默认为.NET 4我们如何从组合文件中取回文件?@Carter:你能澄清一下吗?原始文件仍然存在,在我的例子中,我有两个文件“file.Docx”和“file_Information.Xml”,例如,我希望应用程序A将这两个文件合并到一个文件“file.QAF”。。。然后将此文件传递给另一个应用程序B,以恢复两个文件“file.Docx”和“file_Information.Xml”(返回…)-1:这对大文件不起作用(因为ReadToEnd()
将在内存中创建一个字符串。
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());
}
}
}