问题描述
如题,在.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);
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册