3

我在这里使用示例:http: //msdn.microsoft.com/en-us/library/ms229715.aspx 将一个 1GB 的大文件上传到 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 回答