c# - 如何将一个流的内容复制到另一个流?

标签 c# stream copying

将一个流的内容复制到另一个流的最佳方法是什么?有没有标准的实用方法?

最佳答案

从 .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/

相关文章:

c# - 调用静态嵌套(深度> = 2)方法

sockets - 通过 Udp 套接字的 Python 网络摄像头流

c# - “操作无法完成,因为 DbContext 已被释放。”

c# - 当文件位于应用程序文件夹之外时将 PDF 嵌入 HTML

java - 为什么 write() 和 read() 似乎写入和读取超过一个字节?

python - 无法在 python 中移动文件? Errno 13- 权限被拒绝

MySQL复制一个用户

file - SCP 复制错误 : Not a directory

c# - Entity Framework 数据读取性能

c# - 对象或值作为我的服务/数据层的参数