Загрузка нескольких файлов с помощью libcurl в C ++ - PullRequest
1 голос
/ 05 августа 2011

В настоящее время я пытаюсь создать программу обновления для моего программного проекта.Мне нужно, чтобы он мог загружать несколько файлов, я не против, если они загружаются синхронно или один за другим, что проще (размер файла не является проблемой).Я последовал примеру с веб-страницы libcurl и нескольких других ресурсов и придумал следующее:

#include <iostream>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}
int main(void){
    for (int i = 0; i < 2;){        //download 2 files (loop twice)
        CURL *curl;
        FILE *fp;
        CURLcode res;
        char *url = "http://sec7.org/1024kb.txt";  //first file URL
        char outfilename[FILENAME_MAX] = "C:\\users\\grant\\desktop\\1024kb.txt";
        curl = curl_easy_init();
        if (curl){
            fp = fopen(outfilename,"wb");
            curl_easy_setopt(curl, CURLOPT_URL, url);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
            res = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
            fclose(fp);
        }
         url = "http://sec7.org/index.html"; //I want to get a new file this time
         outfilename[FILENAME_MAX] = "C:\\users\\grant\\desktop\\index.html";

    }
    return 0;
}

Первая проблема заключается в том, удаляю ли я новые назначения файлов (*url = "http://...") и просто пытаюсь зациклитьскачать код дважды, программа просто перестает отвечать.Это происходит при любой комбинации загрузки, вызываемой в программе более одного раза.Другая проблема заключается в том, что я не могу изменить значение массива символов outfilename[FILENAME_MAX].Я чувствую, что это просто глупая ошибка, которую я совершаю, но решение не приходит на ум.Спасибо!

1 Ответ

4 голосов
/ 05 августа 2011
  1. Почему бы не поместить это в функцию и не вызвать ее дважды?

  2. Ваш синтаксис для массивов неверен, плюс все переменные внутри цикла являются локальными, что означает, что они уничтожаются после каждой итерации цикла.

  3. Что сказал Conspicious Compiler. Вот что приводит к зависанию вашей программы; он застрял в бесконечном цикле, потому что i никогда не бывает > 2.

Поместите свой код в функцию, например, так:

void downloadFile(const char* url, const char* fname) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    curl = curl_easy_init();
    if (curl){
        fp = fopen(fname, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    }
}

И дважды позвоните с соответствующими именами файлов и URL:

downloadFile("http://sec7.org/1024kb.txt", "C:\\users\\grant\\desktop\\1024kb.txt");
downloadFile("http://sec7.org/index.html", "C:\\users\\grant\\desktop\\index.html");

Пример функции очень плохой, это всего лишь пример. Вы должны изменить его так, чтобы он возвращал коды ошибок / исключения исключений и тому подобное.

...