|
Программирование >> Формирование пользовательского контейнера
Функция updateO Как объяснялось ранее, если вы хотите следить за процессом загрузки файла из Интернета, следует присвоить параметру update функции download о указатель на функцию, которая будет получать информацию о состоянии процесса зафузки. (Для отказа от этой информации можно просто присвоить параметру update текущее значение null). У функции отслеживания должен быть следующий прототип (конечно, имя у функции может быть другим). Void update(unsigned long total, unsigned long part); Когда вызывается функция updateO, общая длина файла передается параметру total, а количество зафуженных байтов - параметру part. Вы можете использовать эту информацию для предоставления пользователю сведений о зафузке, отображая на экране состояние процесса. throw DLExc( Cant open output file. ); Получает текущую длину файла, return fout.tellp(); У функции openf ile о три параметра: uri, reload и fout. Указатель на строку, содержащую ресурс URL, передается в параметре url. Значение, передаваемое в параметре reload, определяет, нужно ли укорачивать до нуля длину уже имеющегося на диске файла с тем же именем. Параметр fout содержит указатель на переменную, в которой будет размещаться файловый поток после заверщения функции openfileo. Сначала функция openfiieo получает имя файла из строки, заданной параметром url. Затем она проверяет значение параметра reload. Если он равен true, файл открывается для вывода, а содержимое уже имеющегося на диске файла с тем же именем уничтожается. Если параметр reload равен false, функция открывает файл без удаления содержимого имеющегося на диске файла с тем же именем и задает режим дозаписи в конец файла. Затем указатель текущей позиции в файле перемещается на конец файла. Далее с помощью вызова функции teiipo определяется длина файла. Если файл новый, его длина равна нулю. Для уже имеющегося на диске файла с тем же именем определяемая величина равна длине файла, так как указатель текущей позиции в файле был установлен в конец файла при его открытии. Функция openf ile {) возвращает длину файла. листинг 5.2. Заголовочный файл для загрузчика файлов из Интернета Заголовочный файл для загрузчика. Назовите его dl.h. linclude <ioscream> iinclude <string> iinclude <windows.h> Iinclude <wininet.h> iinclude <fstreain> vising namespace std; const int MAX ERRMSG SIZE = 80; Класс исключений для ошибок загрузки, class DLExc { char err [MAX ERRMSG SIZE] ; public: DLExc(char *exc) if(strien(exc) < MAX ERRMSG SIZE) strcpy(err, exc); const char * geterr0 { return err; Class Download { static bool httpverOK(HINTERNET hlurl); static bool getfname(char *url, char *fname); static unsigned long openfile(char *url, bool reload, ofstream &fout); public: static bool download(char *url, bool restart=false, void (*update)(unsigned long, unsigned long)=NULL); Заголовочный файл загрузчика приведенный в листинге 5.2 заголовочный файл следует включать в любой файл, использующий зафузчик файлов из Интернета. Назовите его dl.h. Листинг 5.3. Пример программы, использующей зафузчик файлов из Интернета #include <ioscreain> #include dl.h Эта функция отображает процесс загрузки в виде процентов, void showprogress(unsigned long total, unsigned long part) { int val = (int) ((double) part/total*100); cout val % endl; int main(int argc, char *argv[]) { Этот URL-адрес применяется только для демонстрации. Замените его адресом файла, который вы хотите загрузить, char url[] = http: www.osbome.com/products/0072226803/0072226803 code.zip bool reload = false; if(argc==2 Se& !strcmp(argv[l], reload )) reload = tme; cout Beginning download.\n ; try { if(Download::download(url, reload, showprogress)) cout Download Conplete\n ; } catch(DLExc exc) cout exc.geterrO endl; cout Download Intermpted\n ; return 0; Демонстрация загрузчика файлов из Интернета в листинге 5.3 приведена профамма для демонстрации функционирования зафузчика файлов из Интернета, представляющая собой простое консольное приложение, которое зафужает файл. Назовите файл профаммы dltest.cpp.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |