将一个流的内容复制到另一个流的最佳方法是什么?有没有标准的实用方法?
最佳答案
从 .NET 4.5 开始,有 Stream.CopyToAsync
method
input.CopyToAsync(output);
这将返回 Task
完成后可以继续,如下所示:
await input.CopyToAsync(output)
// Code from here on will be run in a continuation.
请注意,根据调用 CopyToAsync
的位置,后面的代码可能会也可能不会在调用它的同一线程上继续。
SynchronizationContext
调用 await
时捕获的将确定将在哪个线程上执行延续。
此外,此调用(这是一个可能会更改的实现细节)仍然对读取和写入进行排序(它只是不会浪费线程阻塞 I/O 完成)。
从 .NET 4.0 开始,有 Stream.CopyTo
method
input.CopyTo(output);
适用于 .NET 3.5 及之前
框架中没有任何东西可以帮助解决这个问题;您必须手动复制内容,如下所示:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
注意 1:此方法将允许您报告进度(到目前为止已读取 x 字节 ...)
注意 2:为什么使用固定缓冲区大小而不是 input.Length
?因为那个 Length 可能买不到!来自docs :
If a class derived from Stream does not support seeking, calls to Length, SetLength, Position, and Seek throw a NotSupportedException.
关于c# - 如何将一个流的内容复制到另一个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/230128/