2011-07-12 39 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的文檔看看有沒有關於緩衝的東西 - 基本上你想禁用那裏的緩衝。

(在一個側面說明,它是在MSDN一個令人震驚的壞榜樣,在資源處理方面沒有using語句。伊克)

+0

像夢一樣工作 - 謝謝Jon! – Guy

3

通常,你會做的是寫一個循環:

  1. 讀取來自sourceStream塊(類似16 KB是合理的)
  2. 寫入該塊到requestStream
  3. 如果不是在輸入結束後,回到1
+0

感謝您的建議格雷格。我沒有嘗試它,因爲喬恩第一次工作,但它看起來是一個很好的選擇。 – Guy

+0

Jon的建議和我說的一樣,在'CopyTo'裏面:) –