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

最初のものは機能しますが、2番目のものは空のファイルを作成します

GetS3ObjectStreamAmazon Simple ストレージ オブジェクトのストリームを取得します。これは攻略不可能なストリームであり、カーソル位置を変更することはできません。

ここで、ストリーム オブジェクトを複数回使用するように何らかの方法で制限するか、カーソルを先頭に移動する必要があります。

何か案は?

アップ:もちろん、ストリームを一時的に保存するだけです。変数ですが、それをしたくない場合はどうしますか? ストリームを取り、そのような副作用を残すメソッドを作成しても大丈夫ですか? メソッドでソース ストリームを閉じて破棄するとどうなりますか?

4

2 に答える 2

7

ストリームを再作成するか、使用する前に または にバッファリングすることができbyte[]ますMemoryStream

編集:バッファしないソリューションについて言及するのを忘れていました:

  1. 2 つの宛先ストリームを開く
  2. ソース ストリームを開く
  3. ソースが排出されるまで、N バイトのバッファーを読み取り、バッファーを両方の宛先ストリームに書き込みます (Parallel.Invoke() を使用して並行して書き込みを行うこともできます)。
于 2012-06-01T19:14:45.257 に答える
4

ストリームを 1 回だけ読み取る方法の例を次に示します (ストリームの内容の一時コピーを初期化せずに)。

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 に答える