号外号外: 原[图享网]更名为 码友网(codedefault.com) 啦,感谢大家一路上的陪伴与支持。代码的世界里,码友网与大家一起同行!

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

.NET 作者: Rector 781阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

如题,在.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);
    }

阅读了该文章的人还浏览了...

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

发布于: 2018-02-09 10:44:52
分享扩散: