多次使用不可接缝的流

  • 本文关键字: c# stream
  • 更新时间 :
  • 英文 :

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

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

GetS3ObjectStream获取 Amazon Simple 存储对象的流。它是无法切换的流,您无法更改其中的光标位置。

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

有什么想法吗?

UPD:是的,当然你可以简单地将流保存在 temp. 变量中,但如果你不想这样做,那怎么办? 是否可以制作获取流并留下这种副作用的方法?如果我关闭并释放方法中的源流怎么办?

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

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

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

一个示例,说明如何只读取一次流(无需初始化流内容的临时副本)。

这假设您可以将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);
    }
}

相关内容

  • 没有找到相关文章

最新更新