Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Нужна помощь в коде качалки |
Посл.ответ | Сообщение |
|
Создано: 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 - то все путем. А если докачка, он делает вид что типа докачивает в конец файла, на самом деле - качает весь файл заново. Вопрос почему??? Нарыл пару исходников по этому поводу - там тоже самое, так что если я балбес, объясните как что и почему ![]() ----- Лень - это подсознательная мудрость ![]() |
|
Создано: 06 февраля 2008 01:10 · Поправил: HiEndsoft · Личное сообщение · #2 |
|
Создано: 06 февраля 2008 09:41 · Личное сообщение · #3 |
|
Создано: 06 февраля 2008 11:08 · Личное сообщение · #4 |
|
Создано: 06 февраля 2008 11:25 · Личное сообщение · #5 |
|
Создано: 06 февраля 2008 12:14 · Личное сообщение · #6 |
|
Создано: 06 февраля 2008 12:23 · Личное сообщение · #7 |
|
Создано: 06 февраля 2008 14:26 · Личное сообщение · #8 |
|
Создано: 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... ![]() |
|
Создано: 06 февраля 2008 15:21 · Поправил: HiEndsoft · Личное сообщение · #10 depler пишет: HiEndsoft - подробнее плз... сервер докачку ПОДДЕРЖИВАЕТ Ты внимательно комментарии к коду который скопировал посмотри, (ссылку знаешь). Условия задачи:
AssignFile(f, 'c:\123.tmp');
Сам на делфях никогда не писал и то заметил. ----- продавец резиновых утёнков ![]() |
|
Создано: 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, я из того примера и брал половину ----- Лень - это подсознательная мудрость ![]() |
|
Создано: 06 февраля 2008 19:50 · Поправил: HiEndsoft · Личное сообщение · #12 А ты свой код отлаживать пробовал при незавершенной закачке? Он у тебя в InternetSetFilePointer( заходит вообще и что она тебе возвращает проверял? Нормального кода, который не требует доработки мозгами мало, этот не исключение. Если у тебя закачка работает, то баги в докачке ищи дебагером и GetLastError. Я не знаю как в делфях с исключениями, но может где вылетает и выходит из процедуры, т.к. то что ты назвал "проверкой на ошибки" таковой вообще не является. ----- продавец резиновых утёнков ![]() |
|
Создано: 06 февраля 2008 19:57 · Поправил: Talula · Личное сообщение · #13 |
|
Создано: 06 февраля 2008 20:04 · Личное сообщение · #14 блин... что же оно с первого раза не аттачится? ![]() ----- Do Not Get Mad Get Money! ;) ![]() |
|
Создано: 07 февраля 2008 15:42 · Личное сообщение · #15 |
|
Создано: 07 февраля 2008 16:07 · Личное сообщение · #16 |
|
Создано: 07 февраля 2008 16:17 · Поправил: HiEndsoft · Личное сообщение · #17 |
|
Создано: 07 февраля 2008 17:04 · Личное сообщение · #18 |
![]() |
eXeL@B —› Программирование —› Нужна помощь в коде качалки |
Эта тема закрыта. Ответы больше не принимаются. |