Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 770

/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Подскажите как можно проверить есть докачка у файла или нет.

eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 28 ноября 2010, 17:38
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, eclipse!
Я знаю только один надежный способ узнать о том, есть ли докачка или нет. Это попытаться ее сделать. Например сразу. или стартовав основной поток на закачку, стартуем ещё один, ближе к концу. Если сервер возвращает в заголовках, что это не часть файла, а начинает качать с начала (это к примеру можно узнать по передаваемому размеру. Мы, задав диапазон, знаем, сколько байт должен вернуть сервер).
Но нужно помнить, что некоторые сервера не совсем честно "поддерживают" докачку. Например, в одно время, rapidshara давала возможность сделать докачку, но возвращала одни нули или мусор.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 ноября 2010, 19:18
Оценка за ответ: 5

Комментарий к оценке: Ты прав! подругому никак! :)

Мини-форум вопроса

Всего сообщений: 20; последнее сообщение — 29 ноября 2010, 16:44; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 28 ноября 2010, 18:34 [#1]:

Если ссылка статическая, то да. Иначе - к админу сервера, на котором файл живёт.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 28 ноября 2010, 18:51 [#2]:

Ну это в принципе понятно, а вот как узнать это?
idhttp.head ?
в нём рыться?
Вадим К

Вадим К (статус: Академик), 28 ноября 2010, 19:15 [#3]:

Даже если ссылка статическая, это ещё ничего не значит. Сервер может не давать докачку. А почему - а просто админ/программист так решил. Или не смог ее сделать.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 28 ноября 2010, 19:36 [#4]:

Хм... а какой код он должен вернуть? (Если сервер возвращает в заголовках...)

Я сперва качаю часть файла , к стати от сюда - http://exe.agent.mail.ru/magentsetup.exe, тупо первым попался..., потом прерываю допустим на 2 Mb. после чего продолжаю скачивать. дожидаюсь закачки и прогрессбар показывает что скачано около 130 %.

Так вот... о тока меня осенило пока Вам писал - может сравнивать, допустим размер который скачался с размером который нам даст AWorkCountMax, и если допустим на сервере общий размер = 10 метрам, а из них 2 на винте - тогда AWorkCountMax должен дать нам 8 метров... так?... следовательно докачка есть... но тут минус что об этом мы узнаем только в следствии докачки самой... Но если нам вернётся AWorkCountMax равное размеру значит фиг а не докачка...
Так?
Вадим К

Вадим К (статус: Академик), 28 ноября 2010, 22:49 [#5]:

у компонента IdHttp есть свойсто responds (вроде так). У него куча подсвойств - это распарсенный ответ. Как только сработало событие начала закачки, мы можем его анализировать. Там будет и размер, и много чего. Справитесь?
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 10:36 [#6]:

Вы имели ввиду Response?
Ах да... чуть не забыл... DrWeb файл проекта увидел почему-то как вирус (троян) и удалил, экзешник.
Вадим К

Вадим К (статус: Академик), 29 ноября 2010, 10:55 [#7]:

да, Response
А доктор Веб такой, Ваша программа качает с интернета exe файлы? - качает. Спрашивает пользователя - нет. Значит троян:)
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 11:12 [#8]:

Блин уже сделал в два потока ... 1 - сперва выставляю в range кусок который хочу скачать (5 килобайт) потом идёт проверка через response ... это всё работает так как надо!

потом в основном потоке выставляю request.contentrangestart в нужную мне величину... а именно скока до этого скачал (естественно если есть докачка... это я узнаю с первого потока).
Опять же всё работает нормально.... качает с места назначения... в итоге файл с докачкой выкачивается весь (пробовал с докачкой), файл без докачки качается заново... это всё я сделал. НО! файл, в моём случае архив, выкачивается с ошибкой почему - то! хотя через download master он выкачивается нормально (пробовал по разному).
Вадим К

Вадим К (статус: Академик), 29 ноября 2010, 11:24 [#9]:

рекомендую выкачать файл менеджером закачки, а потом Вашим менеджерам. А после этого хекс редактором сравнить. Я думаю, наблюдается краевой эффект (то есть либо внахлест скачивается, либо один байт на границе не докачивается.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:06 [#10]:

Ха-ха... такая идея была у меня... пробовал докачивать и с позиция+1 , скачивается ровно на 1 меньше...
Вадим К

Вадим К (статус: Академик), 29 ноября 2010, 16:09 [#11]:

а позиция случайно не с нуля считается?
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:12 [#12]:

нет... с того места с которого оборвалась скачка. это я проверял выводя в label размер скачанного файла (ну мысля ясна надеюсь).
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:22 [#13]:

В общем у меня агоритм таков :
это в кратце...

LoadedSz:= SizeOfFile(Form4.suiEdit2.Text);
Form4.idhtp1.Head(Form4.suiEdit1.Text);
Form4.idhtp1.Request.ContentRangeStart:= LoadedSz;
Form4.lbl2.Caption:= IntToStr(Form4.Idhtp1.Response.ContentLength); // вот тут вылазит 0, а то что нужно (установленная позиция) появляется только послеповторного запуска.
rcvrdata:=TFileStream.Create(Form4.suiEdit2.text, fmCreate);
rcvrdata.Seek(LoadedSz, soFromBeginning);
Form4.idHtp1.Get(Form4.suiEdit1.text, rcvrdata);

прикол весь в том, что если сделать так, то докачка прекрасно работает... так как надо, даже файл скачивается нормально! НО! (опять ...) 1 - нельзя узнать докачку как тока начали качать (если 1 раз запустилось, т.е. без закачки) и 2 - если сервер не даёт нам докачку естественно получается чушь!

но если делать в 2 потока - то, 1 - скачивать кусочек (н-р 5 кб) делая туже функцию... естественно использовать другой фал например temp.tmp, короче менять исходные приёмники, то всётаки мы узнаём что есть или нету докачки, зато файл дкачивается криво (используя второй поток , как приведено выше, ну там тока добавится if это так then докачивать или нет). В общем така проблемка!
min@y™

min@y™ (статус: Доктор наук), 29 ноября 2010, 16:22 [#14]:

Убери +1 и всё пучком будет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:27 [#15]:

В общем я так понял позиция для докачки устанавливается в тот момент когда сперва сделать
Form4.idhtp1.Request.ContentRangeStart:= LoadedSz;
а потом
Form4.idHtp1.Get(Form4.suiEdit1.text, rcvrdata);

но делая так невозможно узнать установилась ли позиция для докачки в нужную позицию!

короче нужно как-то это узнать перед get запросом!
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:28 [#16]:

min@y™ так пробовал и так тоже!
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:29 [#17]:

min@y™ весь прикол в том что в первом потоке я узнаю про докачку, но узнавая её второй поток мне кажется криво скачивает.
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:31 [#18]:

А Вы сами писали такую программу?
min@y™

min@y™ (статус: Доктор наук), 29 ноября 2010, 16:33 [#19]:

Цитата (eclipse):

А Вы сами писали такую программу?

с докачкой - нет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 29 ноября 2010, 16:44 [#20]:

Значит вместе мучать будем! :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 16:00
Выполнено за 0.03 сек.