Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Нужна помощь в коде качалки
Посл.ответ Сообщение


Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 05 февраля 2008 23:47 · Поправил: depler
· Личное сообщение · #1

Вобщем срочно понадобилось встроить качалку в одну прогу, чтобы была возможность докачивать файлы.
Я накатал функцию:

function GetInetFile2(URL, DestFile: string): string;
var
hInet,
hURL: HINTERNET;
fSize,
ReadLen,
RestartPos: DWORD;
fBuf: array[1..1024] of byte;
f: file;
Header: string;
i: byte;
begin
ReadLen:=1;
result:='Error download: '+DestFile;
RestartPos := 0;
fSize := 0;
{$I-}
if FileExists(DestFile) then
begin
AssignFile(f, DestFile);
Reset(f, 1);
if IOResult<>0 then
begin
result:='Error download: can''t write file '+DestFile;
exit;
end;
RestartPos := FileSize(F);
Seek(F, FileSize(F));
end
else
begin
AssignFile(f, DestFile);
ReWrite(f, 1);
if IOResult<>0 then
begin
result:='Error download: can''t write file '+DestFile;
exit;
end;
end;

for i:=1 to 5 do
begin
hInet := InternetOpen('Mozilla',
PRE_CONFIG_INTERNET_ACCESS,
nil,
nil,
0);
Header := 'Accept: */*';
hURL := InternetOpenURL(hInet,
PChar(URL),
pchar(Header),
StrLen(pchar(Header)),
0,
0);
if RestartPos > 0 then
InternetSetFilePointer(hURL,
RestartPos,
nil,
0,
0);
if InternetQueryDataAvailable(hURL, fSize, 0, 0)=false then
begin
InternetCloseHandle(hURL);
InternetCloseHandle(hInet);
continue;
end else
begin
RegSetString(HKEY_CURRENT_USER, xkey+url, destfile);
break;
end;
end;

while (ReadLen <> 0) and (stopdown = false) do
begin
if InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen)=false then
begin
RegDelKey(HKEY_CURRENT_USER, xkey+url);
exit;
end;
if InternetQueryDataAvailable(hURL, fSize, 0, 0)=false then
begin
RegDelKey(HKEY_CURRENT_USER, xkey+url);
exit;
end;
BlockWrite(f, fBuf, ReadLen);
end;

if (ReadLen = 0) and (stopdown = false) then
begin
result:='Downloaded: '+DestFile;
RegDelKey(HKEY_CURRENT_USER, xkey+url);
end;

InternetCloseHandle(hURL);
InternetCloseHandle(hInet);
CloseFile(f);
{$I+}
end;


Вот если файл качается с 0 - то все путем. А если докачка, он делает вид что типа докачивает в конец файла, на самом деле - качает весь файл заново. Вопрос почему???
Нарыл пару исходников по этому поводу - там тоже самое, так что если я балбес, объясните как что и почему

-----
Лень - это подсознательная мудрость




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 февраля 2008 01:10 · Поправил: HiEndsoft
· Личное сообщение · #2

Все нормальные качалки на сокетах а не на wininet, через нее по моему вообще с пакетами работать нельзя. Хотя.. попробуй сохранять позицию чтения/записи в файле, (типа SetFilePointer) как это делается в нормальном API.

-----
продавец резиновых утёнков





Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 06 февраля 2008 09:41
· Личное сообщение · #3

depler
начнем с того, что во-первых функцию накатал не ты, во-вторых если бы ты сам накатал эту функцию, то у тебя не возникло бы подобных вопросов. и последнее, покури вот это:
delphiworld.narod.ru/base/download_with_download_again.html

-----
iNTERNATiONAL CoDE CReW




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 февраля 2008 11:08
· Личное сообщение · #4

depler пишет:
Я накатал функцию:

..А на утро проснулся и понял, что это до меня кто-то уже сочинил..SetFilePointer

-----
продавец резиновых утёнков





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 06 февраля 2008 11:25
· Личное сообщение · #5

Spirit
delphiworld.narod.ru/base/download_with_download_again.html - тоже самое, я его оттуда и брал

Хорошо конечно подсказали, один фиг не работает

-----
Лень - это подсознательная мудрость




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 февраля 2008 12:14
· Личное сообщение · #6

А ты по размеру сохраненного temp-файла потом устанавливаешь FilePtr? А то в твоем старттопе ничего нет.

-----
продавец резиновых утёнков




Ранг: 78.3 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 06 февраля 2008 12:23
· Личное сообщение · #7

1. Ошибка и заблуждение многи таких факописателей в том, что InternetQueryDataAvailable не вовращает размер.
2. Сервер можт не поддерживать закачку, попробуй на другом.




Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 06 февраля 2008 14:26
· Личное сообщение · #8

HiEndsoft - подробнее плз...
сервер докачку ПОДДЕРЖИВАЕТ

-----
Лень - это подсознательная мудрость





Ранг: 111.1 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 06 февраля 2008 14:54 · Поправил: Lumen
· Личное сообщение · #9

Попробуй здесь http://forum.sources.ru/showtopic=161048&hl=internetsetfilepointer посмотреть. Если не поможет, глянь тут http://forum.sources.ru/act=Search&CODE=show&searchid=338a002a4957e8805fbad1945f73c477&search_in=posts&result_type=topics&highlite=internetsetfilepointer , может найдешь что нужно

-----
The truth is out of there...




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 февраля 2008 15:21 · Поправил: HiEndsoft
· Личное сообщение · #10

depler пишет:
HiEndsoft - подробнее плз...
сервер докачку ПОДДЕРЖИВАЕТ

Ты внимательно комментарии к коду который скопировал посмотри, (ссылку знаешь).
Условия задачи:

Скачиваемый файл сохраняется как c:\123.tmp
При очередном старте скачки идет проверка на наличие оного файла на винте, если он есть, считаем что надо докачивать. Размер этого файла является признаком того, с какого места надо качать.

AssignFile(f, 'c:\123.tmp');
Reset(f, 1);
RestartPos := FileSize(F);
Seek(F, FileSize(F));
****
//устанавливаем позицию в файле для докачки
if RestartPos > 0 then
InternetSetFilePointer(hURL, RestartPos, nil, 0, 0);....

Сам на делфях никогда не писал и то заметил.

-----
продавец резиновых утёнков





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 06 февраля 2008 17:42 · Поправил: depler
· Личное сообщение · #11

HiEndsoft
if FileExists(DestFile) then
begin
AssignFile(f, DestFile);
Reset(f, 1);
if IOResult<>0 then
begin
result:='Error download: can''t write file '+DestFile;
exit;
end;
RestartPos := FileSize(F);
Seek(F, FileSize(F));
end;

это по твоему что? Я добавил проверку, чтобы ошибки не вылетали. И ниже:

if RestartPos > 0 then
InternetSetFilePointer(hURL,
RestartPos,
nil,
0,
0);

Смотри внимательно мой код - там 1 к 1, я из того примера и брал половину

-----
Лень - это подсознательная мудрость




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 06 февраля 2008 19:50 · Поправил: HiEndsoft
· Личное сообщение · #12

А ты свой код отлаживать пробовал при незавершенной закачке? Он у тебя в InternetSetFilePointer( заходит вообще и что она тебе возвращает проверял? Нормального кода, который не требует доработки мозгами мало, этот не исключение. Если у тебя закачка работает, то баги в докачке ищи дебагером и GetLastError. Я не знаю как в делфях с исключениями, но может где вылетает и выходит из процедуры, т.к. то что ты назвал "проверкой на ошибки" таковой вообще не является.

-----
продавец резиновых утёнков





Ранг: 213.0 (наставник), 4thx
Активность: 0.220
Статус: Участник
Тот ещё Lamer

Создано: 06 февраля 2008 19:57 · Поправил: Talula
· Личное сообщение · #13

помнится в старом ксакепе была статья с исходниками качалки... может там глянешь? тоже вроде дельфовая и всё работало...
в аттаче глянь...

-----
Do Not Get Mad Get Money! ;)





Ранг: 213.0 (наставник), 4thx
Активность: 0.220
Статус: Участник
Тот ещё Lamer

Создано: 06 февраля 2008 20:04
· Личное сообщение · #14

блин... что же оно с первого раза не аттачится?

ffee_06.02.2008_CRACKLAB.rU.tgz - Downloader.rar

-----
Do Not Get Mad Get Money! ;)





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 07 февраля 2008 15:42
· Личное сообщение · #15

Talula
тоже видал - не работает

-----
Лень - это подсознательная мудрость





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 07 февраля 2008 16:07
· Личное сообщение · #16

depler пишет:
Talula
тоже видал - не работает


тока что проверил, последний пример всё удачно докачивает качал с кряклаба...

-----
[nice coder and reverser]




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 07 февраля 2008 16:17 · Поправил: HiEndsoft
· Личное сообщение · #17

тоже все работает, ты посмотри какие функции тебе что возвращают и фаервол отключи

-----
продавец резиновых утёнков





Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 07 февраля 2008 17:04
· Личное сообщение · #18

ладно, покопаюсь, хотя задолбало ужо

-----
Лень - это подсознательная мудрость



 eXeL@B —› Программирование —› Нужна помощь в коде качалки
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати