FtpWebRequest Загрузить из памяти - PullRequest
3 голосов
/ 12 июля 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 12 июля 2011

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

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

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

(Кстати, это потрясающе плохой пример в MSDN с точки зрения обработки ресурсов без операторов using. Ick.)

3 голосов
/ 12 июля 2011

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

  1. Читает фрагмент из sourceStream (что-то вроде 16 КБ разумно)
  2. Записывает этот блок вrequestStream
  3. Если не в конце ввода, вернитесь к 1.
...