复制两个目的地的流内容

时间:2017-05-01 10:45:16

标签: c# stream copy

我知道可以使用sourceStream.CopyTo(targetStream);将一个流复制到另一个流但我想将sourceStream的内容复制到两个不同的Task中的两个目标流中小号即可。当我两次调用此方法时,第二次流是空的。

这有可能吗?一种简单的方法是将流内容加载到内存然后将其复制到目标上,但这可能会导致OutOfMemoryException

如果重要的是我使用.Net 4.5

2 个答案:

答案 0 :(得分:2)

如果您将其同时复制到两个目的地 ,那么类似:

byte[] buffer = new byte[SOME_SIZE];

int bytesRead;
while((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
{
    dest1.Write(buffer, 0, bytesRead);
    dest2.Write(buffer, 0, bytesRead);
}

这会迭代输入流一次,将每个块写入两个输出。这几乎是CopyTo内部的作用 - 唯一的区别是第二个输出。

答案 1 :(得分:0)

使用以下方法多次复制流:

private static Stream CopyStream(Stream inputStream)
{
    const int readSize = 256;
    byte[] buffer = new byte[readSize];
    MemoryStream ms = new MemoryStream();

    int count = inputStream.Read(buffer, 0, readSize);
    while (count > 0)
    {
        ms.Write(buffer, 0, count);
        count = inputStream.Read(buffer, 0, readSize);
    }
    ms.Position = 0;
    return ms;
}

将其用作:

Stream destStream1 = CopyStream(sourceStream);
Stream destStream2 = CopyStream(sourceStream);