Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Скачать файл с докачкой


Автор: Gregorian 11.1.2007, 18:14
Как скачать файл с возможностью докачки?

Автор: awers 12.1.2007, 02:37
думаю смысл довольно прост. Если в один поток - держи в памяти метку, сколько скачали. Коннект оборвался (если сервер поддерживает докачку) - начинай качать с метки ...

Автор: Gregorian 12.1.2007, 12:06
Это и козе понятно!  smile 
Я не знаю как начать закачку с заданной позиции в файле? Как осуществить это на http и ftp? Я не собираюсь писать для этих протоколов собственные библиотеки!

Автор: awers 12.1.2007, 12:41
А нафига? Попробуй к примеру посмотреть специф. к апачу .. а мож по самому HTTP. 
Как вариант мона посмотреть на примере софтины RegetDelux какие хедеры она отправляет для получения файла с определенной позиции

Автор: Ch0bits 13.1.2007, 18:07
Давноненько задумывался на этой проблемой. По идее должна быть возможность позиционировать по сетевому потоку, но я такого не нашёл.
Есть альтернативная идея. В классе HttpWebRequets есть возможность добавить диапазон скачивания AddRange. Таким образом, файл можно разделить на секторы (кусочки). Состояние, закачан сектор или нет, можно сохранять в битовой карте. Для скорости сделать закачку многопоточной, чтобы одновременно запрашивались несколько секторов. Размер сектора выбирается как размер который не страшно потерять при обрыве. Хотя можно и для недокачанного сектора сохранять состояние.
Написал тривиальный пример от балды, т.к. студии нет.
Код

public void DownloadFileSection(Uri uri, int beginPos, int endPos, String destFile)
{
    HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(uri);

    // Добавлям в запрос откуда и до куда качать
    wreq.AddRange(beginPos, endPos);

    WebResponse wres = wreq.GetResponse();
    Stream stream = wres.GetResponseStream();
    using (FileStream fstream = new FileStream(destFile, FileMode.Create, FileAccess.Write, FileShare.None))
    {
            int b;
            while ((b = stream.ReadByte()) != -1)
                fstream.WriteByte((byte)b);
    }
}


Добавлено @ 18:11 
Вот ещё. Позиционировать по файлу, чтобы сохранять секторы, можно с помощью метода Seek класса FileStream.

Автор: Gregorian 13.1.2007, 20:23
awers, не понял, что вы имеете в виду? Я об Апаче не имею представления и как хедеры посмотреть тоже не знаю.

Ch0bits, сложновато оказывается... Спасибо за идею!

Другие предложения принимаются.

Автор: Stepan_Lameroff 13.1.2007, 21:38
http://www.codeproject.com/cs/library/downloader.asp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)