3

ここで例を使用しています: http://msdn.microsoft.com/en-us/library/ms229715.aspx で、1 GB の大きなファイルを FTP サーバーにアップロードします。ただし、次の行でチョークします。

byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());

メモリ不足の例外があります。すべてのファイルを一度にメモリに読み込まずに、ファイルをディスクから FTP サーバーに直接ストリーミングする方法はありますか? チャンクして少しずつ送信できると思いますが、読み取りストリームを書き込みストリームに向けることができると思っていました...

4

2 に答える 2

5

チャンクで要求ストリームに単純に書き込むことを試すことができます.NET 4を使用している場合、Stream.CopyToこれは非常に簡単になります:

using (Stream input = File.OpenRead(filename))
{
    using (Stream output = request.GetRequestStream())
    {
        input.CopyTo(output);
    }
}

のドキュメントを見FtpWebRequestて、バッファリングについて何かあるかどうかを確認することをお勧めします。基本的には、そこにあるバッファリングを無効にする必要があります。

(ちなみに、MSDN では、ステートメントなしでリソースを処理するという点で、これは驚くほど貧弱な例usingです。Ick.)

于 2011-07-12T06:33:55.793 に答える
3

通常、次のようなループを記述します。

  1. からチャンクを読み取りますsourceStream(16 kB 程度が妥当です) 。
  2. そのチャンクをrequestStream
  3. 入力の最後にない場合は、1 に戻ります。
于 2011-07-12T06:33:11.910 に答える