Скачивание файлов с помощью менеджера загрузки в C#

Я создаю менеджер загрузок на С#. В настоящее время я разрабатываю компонент загрузки, который дает URL-адрес, загружает файлы с URL-адреса в сегментах.

В настоящее время я использую потоки ввода-вывода для каждого фрагмента, как показано ниже:

    MyChunks.InputStream = rs ; 
//rs is obtained by using GetResponse() from FtpWebRequest or HttpWebRequest
    MyChunks.OutputStream = fs ; //fs is FileStream for writing on local file
    chunksize = MyChunks.InputStream.Read(buffer, 0, bufferSize);
    MyChunks.OutputStream.Write(buffer, 0, (int)chunksize);

Что касается других методов, которые я проанализировал, я обнаружил, что я также могу использовать метод `WebClient.DownloadDataAsync`.
Однако я не могу использовать фрагменты данных, загруженные в несколько потоков, для ускорения загрузки. Более того, приведенный выше код работает нормально.


Мой вопрос:

  1. Существуют ли какие-либо другие способы загрузки фрагментов или приведенный выше код подходит?

  2. Кроме того, я хочу воспроизводить аудио (mp3) / видеофайлы по мере их загрузки. Можете ли вы предложить способ сделать то же самое?


person Chirag Rupani    schedule 24.08.2013    source источник


Ответы (1)


С выложенным кодом вы скачиваете только часть файла, это правильно. В зависимости от того, насколько велик ваш буфер, маловероятно, что вся загрузка поместится в буфере. Таким образом, вам придется повторять фрагмент кода сверху до тех пор, пока не будет достигнут конец потока. Вот как работает чтение из буферизованного потока.

Но при загрузке файла по частям существует распространенное мнение, что файл разделен на несколько частей, а затем эти части загружаются по отдельности.

Чтобы реализовать это, вам нужно будет использовать заголовок HTTP Range (см. этот вопрос для обсуждения), что позволяет загружать только часть данных и использовать несколько клиентов.

Но загрузка не ускорится, даже если вы используете несколько потоков для одновременной загрузки фрагментов, потому что ваш пропускная способность ограничивает скорость загрузки. Вместо этого вам придется управлять смещениями блоков и избыточными соединениями.

Упомянутый метод DownloadDataAsync используется для загрузки данных неблокирующим способом, вы можете посмотреть этот вопрос для обсуждения.

А теперь ко второй части вашего вопроса: хотя в определенных сценариях может работать загрузка ваших файлов по частям во время воспроизведения, этот подход не будет работать при более медленных соединениях. Рассматривали ли вы возможность поиска решения для потоковой передачи?

Наконец, этот вопрос указывает на NAudio, который даже поставляется с Mp3StreamingDemo, который позволяет воспроизводить потоковые аудиофайлы в формате mp3.

person ventiseis    schedule 08.08.2016