不止一次地使用不可访问的流

时间:2012-06-01 19:13:01

标签: c# stream

using (var stream = GetS3ObjectStream(fooObj))
{
    WriteStreamToFtp(stream, "ftp://firstserver");
    WriteStreamToFtp(stream, "ftp://SecondServer"); 
}

第一个会起作用,但第二个会创建一个空文件

GetS3ObjectStream获取Amazon Simple存储对象的流。这是不可靠的流,你无法改变其中的光标位置。

现在,我要么不得不以某种方式限制多次使用流对象,要么我必须将光标移动到开头。

任何想法?

upd:是的,你当然可以简单地将流保存在temp中。变量,但如果你不想这样做,那么呢?是否可以制作采用流的方法,并留下这些副作用? 如果我关闭并在方法中处理源流怎么办?

2 个答案:

答案 0 :(得分:7)

您可以在使用前重新创建流或将其缓冲到byte[]MemoryStream

编辑:我忘了提一个不缓冲的解决方案:

  1. 打开两个目标流
  2. 打开源流
  3. 直到源耗尽,读取N个字节的缓冲区并将缓冲区写入两个目标流(您甚至可以使用Parallel.Invoke()并行写入)

答案 1 :(得分:4)

这是一个如何只读取一次流(不初始化流内容的临时副本)的示例。

这假设您可以将WriteStreamToFtp来电替换为对实际目标流的访问权限。请注意,FtpStream构造函数是占位符代码。

using (var source = GetS3ObjectStream(fooObj))
using (var target1 = new FtpStream("ftp://firstserver"))
using (var target2 = new FtpStream("ftp://SecondServer"))
{
    byte[] buffer = new byte[1024];
    while (true)
    {
        int count = source.Read(buffer, 0, buffer.Length);
        if (count == 0)
            break;

        target1.Write(buffer, 0, count);
        target2.Write(buffer, 0, count);
    }
}