Mar*_*tin 8 c# filesystems file-io
我有超过125个TSV文件,每个~100Mb,我想要合并.合并操作允许销毁125个文件,但不能销毁数据.什么事情是最后,我最终得到一个接一个的所有文件的内容的大文件(没有特定的顺序).
有没有一种有效的方法呢?我想知道Windows是否提供了一个API来简单地创建所有这些文件的大"联盟"?否则,我将不得不阅读所有文件并写一个大文件.
谢谢!
Jon*_*eet 17
所以"合并"实际上只是一个接一个地写文件?这非常简单 - 只需打开一个输出流,然后重复打开输入流,复制数据,关闭.例如:
static void ConcatenateFiles(string outputFile, params string[] inputFiles)
{
using (Stream output = File.OpenWrite(outputFile))
{
foreach (string inputFile in inputFiles)
{
using (Stream input = File.OpenRead(inputFile))
{
input.CopyTo(output);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那是使用Stream.CopyTo.NET 4中的新方法.如果你不使用.NET 4,另一个帮助方法会派上用场:
private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
Run Code Online (Sandbox Code Playgroud)
我没有意识到这比这更有效......但重要的是,这根本不会占用你系统上的大量内存.这并不是说它反复将整个文件读入内存然后再写出来.
编辑:正如在评论中指出,有办法,你可以用文件选项捣鼓可能使它稍微在什么样的文件系统中的数据确实方面是高效.但从根本上说,无论哪种方式,你都会一直在阅读数据并一次写入缓冲区.