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

第一个可以工作,但第二个只会创建一个空文件

GetS3ObjectStream获取 Amazon Simple 存储对象的流。这是不可分割的流,您无法更改其中的光标位置。

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

有任何想法吗?

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

4

2 回答 2

7

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

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

  1. 打开两个目标流
  2. 打开源流
  3. 在源耗尽之前,读取 N 字节的缓冲区并将缓冲区写入两个目标流(您甚至可以使用 Parallel.Invoke() 并行写入)
于 2012-06-01T19:14:45.257 回答
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);
    }
}
于 2012-06-01T20:01:38.010 回答