FtpWebRequest Загрузить не хватает памяти

Я использую пример здесь: http://msdn.microsoft.com/en-us/library/ms229715.aspx, чтобы загрузить большой файл размером 1 ГБ на FTP-сервер. Однако он задыхается на линии:

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

с исключением нехватки памяти. Есть ли способ передать файл с диска прямо на FTP-сервер, не считывая его все сразу в память? Я ожидаю, что смогу разбить его и отправить по частям, но я бы подумал, что смогу указать поток чтения на поток записи...


person Guy    schedule 12.07.2011    source источник


Ответы (2)


Вы можете попробовать просто писать в поток запросов порциями — если вы используете .NET 4, Stream.CopyTo сделает это очень просто:

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

Возможно, вы захотите посмотреть документацию FtpWebRequest, чтобы узнать, есть ли что-нибудь о буферизации - в основном вы хотите отключить любую буферизацию, которая там есть.

(С другой стороны, это ужасно плохой пример в MSDN с точки зрения обработки ресурсов без операторов using. Ик.)

person Jon Skeet    schedule 12.07.2011

Как правило, вы должны написать цикл, который:

  1. Читает фрагмент из sourceStream (примерно 16 КБ)
  2. Записывает этот фрагмент в requestStream
  3. Если не в конце ввода, вернитесь к 1.
person Greg Hewgill    schedule 12.07.2011
comment
Спасибо за предложение, Грег. Я не пробовал, потому что Джон сработал с первого раза, но это похоже на хорошую альтернативу. - person Guy; 14.07.2011
comment
Предложение Джона делает то же самое, что и я, внутри CopyTo :) - person Greg Hewgill; 14.07.2011