Добрый вечер.
Появилась необходимость написать программу, которая будет скачивать файл, весом 4гб.
Воспользовался WebClient и просто сделал в программе кнопку, при нажатии на которую начиналась скачка того самого файла. Добавил прогресс бар и запустил программу. Нажал на кнопку, после чего понял, что скачка такого файла занимает много времени (минут 20). Метод со сжатием файла в архив рассматривать не буду, нужно скачать его без архива.
Как можно это сделать?
Читал про скачку файлов по частям, но нигде не нашел рабочих примеров и т.п.
Пожалуйста, помогите найти нужное.
Спасибо.
Толк в том, что если сеть между сервером и клиентом перегружена, то несколько TCP потоков отожмут себе больше пропускной способности чем один. Конечно этот способ не слишком честный по отношению к другим, но вполне себе рабочий. Если у автора вопроса не зарезанные 100 мегабит, то можно скачать файл раза в 3 быстрее.
Отрываем немного водопроводный кран... и черпаем хоть одной хоть сразу десятью кружками в ведро - скорость наполнения ведра будет одинаковой... Точнее при большом количестве кружек часть прольётся...
Так и тут - общее время на скачку будет определяться размером файла деленному на самую меньшую скорость между отправителем и получателем.
Единственное что можно сделать для сокращение времени при ситуациях обрывов связи и повторов закачки - использовать механизмы докачки (это если отдающая сторона умеет).
Тогда общая канва будет выглядеть следующим образом:
- получаем размер файла
- готовим список фрагментов исходя из размера и прочих предположений
- качаем файл фрагментами (Range)
- если скачка удалась - метим фрагмент полученным, а неудавшуюся - повторяем
- когда все фрагменты получены - собираем их в файл
profit
p.s. по вкусу вышеописанное можно пускать в несколько потоков - иногда лимитер отдачи может лимитировать по конкретному соединению, а не сессии и суммарная скорость может подрасти.
Этот же файл от туда же и в то же время дня другими средствами (браузер, веб качальщики) качается быстрее?
Если 'нет' - то причина скорее в интернет провайдере или на отдающей стороне (могут ограничивать скорость или просто перегружен провайдер)
Если 'да', что маловероятно - то нужно смотреть, как именно качаешь файл, хотя с webclient сложно где то напортачить, может там реализация корявая? Как вариант, реализовать многопоточную закачку (бывает провайдеры как на отдающей стороне так и локальные, ограничивают скорость на подключение а не на всю сессию).