using (var stream = GetS3ObjectStream(fooObj))
{
WriteStreamToFtp(stream, "ftp://firstserver");
WriteStreamToFtp(stream, "ftp://SecondServer");
}
第一个会起作用,但第二个会创建一个空文件
GetS3ObjectStream
获取Amazon Simple存储对象的流。这是不可靠的流,你无法改变其中的光标位置。
现在,我要么不得不以某种方式限制多次使用流对象,要么我必须将光标移动到开头。
任何想法?
upd:是的,你当然可以简单地将流保存在temp中。变量,但如果你不想这样做,那么呢?是否可以制作采用流的方法,并留下这些副作用? 如果我关闭并在方法中处理源流怎么办?
答案 0 :(得分:7)
您可以在使用前重新创建流或将其缓冲到byte[]
或MemoryStream
。
编辑:我忘了提一个不缓冲的解决方案:
答案 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);
}
}