Delphi для качков Лозовский Александр Xakep, номер #052, стр. 052-074-3 IF SaveDialog1.Execute then Edit2.Text:= SaveDialog1.FileName; Этот код добавлен, чтобы не вводить путь вручную. Теперь посмотри на код в блок-врезке. Попытайся понять содержимое этого листинга. Понял? Не понял? :) В общем, набей его в свой проект. Логика работы программы такая. Сначала мы проверяем наличие заданного файла. Если его нет, то качаем с нуля, если же он существует, то за начальную позицию для докачки берем размер локального файла и подставляем это значение в InternetSetFilePointer. Что мы и делаем. Затем циклически читаем по 1024 байта от интернет-файла, пока не скачаем его целиком. Это и будет конец загрузки. Хотя, на случай ручного прерывания, впиши в OnClick для 2-й кнопки такой код: NADO:= FALSE Все остальное ясно и по комментариям, поэтому я протестирую эту программу и перейду к заключению. 5 МИНУТ - ПОЛЕТ НОРМАЛЬНЫЙ Я запустил закачку файла, но в середине процесса у меня подло прервалась связь (случайно задел момед ногой, он упал со стола и выдернулся из сети), за что я и словил известное тебе сообщение. Подняв модем и восстановив коннект, я запустил докачку и успешно слил файл. Заметь, с весьма неплохой скоростью, а все это благодаря компании майкрософт и нашим с тобой прямым ручкам. ЗАКЛЮЧЕНИЕ Программа получилась очень простой, и в твоих руках возможность довести ее до нужного уровня: убрать цикл в отдельный поток, а иначе будет тормозить интерфейс, добавить различные прогрессбары и прочую приятную лабуду (][ об этом писал не раз). Исходники, как всегда, можешь взять на сайте www.cydsoft.com/vr-online - не будем нарушать традицию. На этом все. Удачи тебе и до новых встреч в эфире. Листинг TForm1.BitBtn1Click procedure TForm1.BitBtn1Click(Sender: TObject); var F: File; ResumePos,BufferLen,SumSize: DWORD; hSession, hURL: HInternet; Buffer: array[1..1024] of Byte; err: boolean; begin SumSize:=0; ResumePos:=0; //Инициализируемся AssignFile (F,Edit2.Text); //Свяжемся с файлом IF FileExists (Edit2.Text) then //Есть ли на диске этот файл begin Reset(f,1); //Ах, есть? Откроем! ResumePos:=FileSize(F); //Откуда докачать Seek(F, FileSize(F)); //А писать будем в конец end else ReWrite(f,1); //А раз нет, так создадим NADO:= TRUE; //Надо качать... //Открыли сессию hSession:= InternetOpen('X-Kachalka',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0); //И наш УРЛ hURL := InternetOpenURL(hSession,PChar(Edit1.Text),nil,0,0,0); //Сколько там наш файл весит? InternetQueryDataAvailable(hURL, SumSize,0,0); label4.Caption:= IntToStr (SumSize); //Сообщим об этом if ResumePos>0 then //Если докачиваем, begin InternetSetFilePointer(hURL,ResumePos,nil,0,0); //То сместимся end; REPEAT //Качаем err:= InternetReadFile(hURL, @Buffer,SizeOf(Buffer),BufferLen); //Читаем буфер IF err= false then //Ошибка чтения begin ShowMessage ('Произошел облом :('); //Сообщим и выходим exit; end; BlockWrite(f, Buffer, BufferLen); //Пишем в файл Application.Processmessages; |