2011-07-12 2 views
3

ここでは、例を使用しています: http://msdn.microsoft.com/en-us/library/ms229715.aspx 大きな1GBファイルをFTPサーバーにアップロードする場合。しかし、それはライン上でチョーク:FtpWebRequestメモリ不足をアップロードする

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

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

答えて

5

あなたは単にチャンクで要求ストリームへの書き込みを試すことができます - あなたは、.NET 4、Stream.CopyToを使用している場合、これは本当に簡単になります。

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

あなたはFtpWebRequestのマニュアルに見たいかもしれませんバッファリングについて何かがあるかどうか確認してください。基本的にバッファリングが無効になっています。

(サイドノートでは、それはusing文のないリソースハンドリングの面で、MSDNでの衝撃的な貧困例です。嫌。)の提案グレッグのための

+0

夢のように働いてくれました - ありがとうジョン! – Guy

3

一般的には、 :(16キロバイトが合理的であるようなもの)

  1. がない場合は
  2. は、入力の終わりにrequestStream
  3. にそのチャンクを書き込みsourceStreamからチャンクを読み込み、1
に戻ります
+0

感謝。私はJon'sが初めて仕事をしたのでそれを試しませんでしたが、それは良い選択肢のように見えます。 – Guy

+0

ジョンの提案は、私が言ったのと同じことを 'CopyTo'の中で行います:) –