2011-07-12 37 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'里面:) –