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;

Назад на стр. 052-074-2  Содержание  Вперед на стр. 052-074-4

Hosted by uCoz