![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здраствуйте все!
У меня такой вопрос... Помогите составить код, я хочу чтобы при нажатии кнопки у меня проверял фаил на сервере 'URL' и если есть нужный ему фаил она (программа) скачивала этот фаил у меня и потом делала следующий действия (я их уже написал), а если нету файла то он выдавал новую форму (Form 5) с предупреждением что файла нету. Можете мне составить код и прокоментировать? Буду очень благодарен! |
#2
|
|||
|
|||
![]() Для решения задачи необходимо проверить существование опрделенного адреса(URL) в интернете:
Код:
uses wininet; function CheckUrl(url: string): boolean; var hSession, hfile, hRequest: hInternet; dwindex, dwcodelen: dword; dwcode: array [1..20] of char; res: pchar; begin if pos('http://', lowercase(url)) = 0 then url := 'http://'+url; Result := false; hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if assigned(hsession) then begin hfile := InternetOpenUrl(hsession, pchar(url), nil, 0, INTERNET_FLAG_RELOAD, 0); dwIndex := 0; dwCodeLen := 10; HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex); res := pchar(@dwcode); result := (res = '200') or (res = '302'); if assigned(hfile) then InternetCloseHandle(hfile); InternetCloseHandle(hsession); end; end; Эта функция проверяет только два возвращаемых кода '200'(ОК) или '302' (Редирект), но Вы можете заставить проверять функцию и другие коды. Для этого достаточно модифицировать строчку "result := ". Теперь мы знаем что файл существует... Значит загружаем ![]() Код:
function GetInetFile(const fileURL, FileName: string): boolean; const BufferSize = 1024; var hSession, hURL: HInternet; Buffer: array[1..BufferSize] of Byte; BufferLen: DWORD; f: file; sAppName: string; begin Result := False; sAppName := ExtractFileName(Application.ExeName); hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); try hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0); try AssignFile(f, FileName); Rewrite(f,1); repeat InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen); until BufferLen = 0; CloseFile(f); Result := True; finally InternetCloseHandle(hURL); end; finally InternetCloseHandle(hSession); end; end; ну вот в общем и вся примудрость... правдо все корявенько малех... но за то рботает... сам проверял ![]() |
#3
|
|||
|
|||
![]() Ой как спасибо! Вы гений!
Тока у меня небольшой вопрос, перед вторым кодом в Uses Нада чтото дописывать? а то у меня когда пытается второй код проверять выдает ошибку на Function Последний раз редактировалось AkaruZ, 05.02.2009 в 15:19. |
#4
|
|||
|
|||
![]() хм... не должен... может ты какую ниюудь квычку или точку с запятой пропустил
Кто знал, тот знал точно. Кто не любит свет, тот и живет ночью. |
#5
|
|||
|
|||
![]() Ну я как бы скопировал твой текст и пропустить не мог
![]() |
#6
|
|||
|
|||
![]() Можеш сказать свой ICQ? Ты мне объясниш немнога поподробнее
![]() |
#7
|
|||
|
|||
![]() Ну тут объяснять то впринцепе нечего... смотри...
Я тебе предложил две функции 1. определяет существования URL если URL существует то она возвращает значение true 2. загружает файл если файл загружен возвращает значение true прописываешь эти 2-е функции после "implementation" потом поочереди вызываешь эти функции например if CheckUrl('http//www.bla-bla-bla/bu.dll')=true then {код если url существует} if GetInetFile('http//www.bla-bla-bla/bu.dll', 'kak_sohranit.dll')=true then {код после загрузки текста} Кто знал, тот знал точно. Кто не любит свет, тот и живет ночью. |
#8
|
|||
|
|||
![]() Спасибо! Большое
|
#9
|
||||
|
||||
![]() А может подскажете как еще сделать, что бы прога не повисала во время проверки файла??? Просто у меня проверяется несколько файлов сразу вот и подвисает...
|
#10
|
||||
|
||||
![]() В процессе проверок и прочего вызывай
Код:
Application.ProcessMessages; ЗЫ: Спасибо, спёр код в свою прогу. Нужен для апдейтера. Правда, немного модифицировал функцию сохранения, ибо не всё надо сохранять в файл... Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 19.04.2009 в 02:15. |
#11
|
||||
|
||||
![]() а можно ли вообще сделать прогресс бар для загрузки через GetInetFile??? и если можно то как???
|
#12
|
||||
|
||||
![]() Найди функцию GetInetFileSize, это будет ProgressBar.Max. И каждый раз при загрузке фрагмента файла
Код:
ProgressBar.Progress:=ProgressBar.Progress+BufferLen; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#13
|
||||
|
||||
![]() Спасибо большое!!! Работает))
|