Загрузка нескольких файлов с помощью libcurl в C++
В настоящее время я пытаюсь сделать обновление для моего программного проекта. Мне нужно, чтобы он мог загружать несколько файлов, я не против, если они загружаются синхронно или один за другим, что проще (размер файла не является проблемой). Я последовал примеру с веб-страницы 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 ответ
Почему бы не поместить это в функцию и вызвать ее дважды?
Ваш синтаксис для массивов неверен, плюс все переменные внутри цикла являются локальными, что означает, что они уничтожаются после каждой итерации цикла.
Что сказал Conspicuous 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");
Функция примера очень плохая, это всего лишь пример. Вы должны изменить его так, чтобы он возвращал коды ошибок / исключений и тому подобное.