我不相信.NET中有任何可以在不将其缓存在内存中的情况下复制文件部分的功能。然而,我认为这种方法本身就是低效的,因为它需要多次打开输入文件并进行寻址。如果你只是想要分割文件,为什么不先打开输入文件,然后只需编写类似以下的代码:
public static void CopySection(Stream input, string targetFile, int length)
{
byte[] buffer = new byte[8192];
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
这个方法在每次调用时都会创建一个缓冲区,有些不够高效 - 你可能想要先创建缓冲区并将其作为参数传递给该方法:
public static void CopySection(Stream input, string targetFile,
int length, byte[] buffer)
{
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
请注意,这也会关闭输出流(由于使用语句),而您的原始代码没有这样做。
重要的是,这将更有效地使用操作系统文件缓冲,因为您重用相同的输入流,而不是在开头重新打开文件,然后寻找。
我认为它会明显更快,但显然您需要尝试一下才能确定...
当然,这假定连续的块。如果您需要跳过文件的某些部分,则可以从方法外部执行该操作。此外,如果您正在编写非常小的文件,则可能还要针对该情况进行优化-最简单的方法可能是引入一个包装输入流的
BufferedStream
。