首页 / .NET / 正文

[C#].NET/C#程序开发中复制一个数据流(Stream)的内容到另一个数据流的方法有哪些?

6304 发布于: 2018-02-09 读完约需5分钟

问题描述

如题,在.NET/C#程序开发中,复制一个数据流的内容到另一个数据流的方法有哪些?有没有一个标准的工具类库来完成这样的操作呢?

方案一

在.NET 3.5 或者以前的版本中,.NET Framework没有内置直接复制数据流的方法,所以我们需要手动来完成数据流的复制操作,如:

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);
    }
}

在.NET 4.0 或者以上版本,.NET Framework 内置了Stream.CopyTo()的方法,如:

input.CopyTo(output);

在.NET 4.5及以上版本,.NET Framework 内置了Stream.CopyToAsync()方法,如:

input.CopyToAsync(output);

方案二

手动实现一个复制数据流的静态扩展方法,如:

public static void CopyTo(this Stream src, Stream dest)
    {
        int size = (src.CanSeek) ? Math.Min((int)(src.Length - src.Position), 0x2000) : 0x2000;
        byte[] buffer = new byte[size];
        int n;
        do
        {
            n = src.Read(buffer, 0, buffer.Length);
            dest.Write(buffer, 0, n);
        } while (n != 0);
    }

    public static void CopyTo(this MemoryStream src, Stream dest)
    {
        dest.Write(src.GetBuffer(), (int)src.Position, (int)(src.Length - src.Position));
    }

    public static void CopyTo(this Stream src, MemoryStream dest)
    {
        if (src.CanSeek)
        {
            int pos = (int)dest.Position;
            int length = (int)(src.Length - src.Position) + pos;
            dest.SetLength(length);

            while(pos < length)
                pos += src.Read(dest.GetBuffer(), pos, length - pos);
        }
        else
            src.CopyTo((Stream)dest);
    }

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [ASP.NET Core Razor Pages系列教程]开始安装和使用ASP.NET Core 2.x(01)

下一篇: [.NET/C#].NET/C#程序开发中克隆/拷贝一个泛型集合List<T>的方法有哪些?

本文永久链接码友网 » [C#].NET/C#程序开发中复制一个数据流(Stream)的内容到另一个数据流的方法有哪些?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册