Логика работы сего процесса мне, вроде бы, понятна:
Проверяем наличие файла. Если существует (опустим проверки на необходимость докачки), то берем размер файла и при загрузке подставляем в заголовок "Range" и качать будем начиная с той части, на которой закончилась закачка существующего файла.
Проблема в том, что при загрузке даже с нужного байта, файл перезаписывается.
Вижу решение:
Во время старта загрузки проверять наличие файла, как делалось ранее, и если есть, то с нужного байта загружать новый файл туда же, но добавлять расширение .bak. Тем самым, если снова загрузка обрывалась, мы сможем склеить существующий файл с файлом .bak, после чего последний удалить и снова начать докачку в файл .bak.
Но для меня тут появилась проблема - не знаю как склеить файлы правильно и как в последствии отображать в DownloadProgressChangedEventHandler, чтобы при загрузке отображался размер не количество загруженных сейчас байт (даже с нужного фрагмента), а вместе со вторым файлом, с которым они будут склеены. Или если я начну качать с половины, то сразу будет отображаться 50% прогресс загрузки?
В этот раз хотелось бы увидеть примеры кода, которые помогут мне в реализации, если не сложно.
Какой конкретно метод у веб-клиента вы вызываете, что он файл перезаписывает? Может надо куда-нибудь в поток сначала качать, а потом уже самому в файл писать? В чем сложность? Никаких bak-ов создавать не надо, это муть.
Станислав Макаров: DownloadFileAsync. Только если я буду писать в поток, а программа завершится, выключится компьютер, например, то ничего не сохранится, так как поток будет в памяти.
Ищу примеры, чтобы подобное попробовать реализовать.
IPv4 Как насчёт OpenRead? Вероятно, из потока, который вернет эта функция, можно будет читать до того, как скачается весь файл. Тогда вы сможете дописывать файл частями (допустим, по 1 кб), и все будет сохраняться.