Barre de progression de la console C ++ libcurl
-
08-07-2019 - |
Question
Je souhaite qu'une barre de progression apparaisse dans la fenêtre de la console pendant le téléchargement d'un fichier. Mon code est le suivant: Télécharger le fichier à l'aide de libcurl en C / C ++ .
Comment avoir une barre de progression dans libcurl?
La solution
Votre compteur.
int progress_func(void* ptr, double TotalToDownload, double NowDownloaded,
double TotalToUpload, double NowUploaded)
{
// ensure that the file to be downloaded is not empty
// because that would cause a division by zero error later on
if (TotalToDownload <= 0.0)) {
return 0;
}
// how wide you want the progress meter to be
int totaldotz=40;
double fractiondownloaded = NowDownloaded / TotalToDownload;
// part of the progressmeter that's already "full"
int dotz = round(fractiondownloaded * totaldotz);
// create the "meter"
int ii=0;
printf("%3.0f%% [",fractiondownloaded*100);
// part that's full already
for ( ; ii < dotz;ii++) {
printf("=");
}
// remaining part (spaces)
for ( ; ii < totaldotz;ii++) {
printf(" ");
}
// and back to line begin - do not forget the fflush to avoid output buffering problems!
printf("]\r");
fflush(stdout);
// if you don't return 0, the transfer will be aborted - see the documentation
return 0;
}
Autres conseils
Extrait de la documentation de Curl
CURLOPT_PROGRESSFUNCTION
Pointeur de fonction devant correspondre à la Prototype curl_progress_callback trouvé dans . Cette fonction obtient appelé par libcurl au lieu de son équivalent interne avec une fréquence intervalle pendant le fonctionnement (environ une fois par seconde), peu importe si les données sont être transféré ou non. Arguments inconnus / non utilisés passés au rappel sera mis à zéro (comme si vous ne téléchargiez que des données, le la taille de téléchargement restera 0). Retour une valeur non nulle de ce rappel provoquera l'avortement de libcurl transfert et retour CURLE_ABORTED_BY_CALLBACK.
Donc:
Vous fournissez une fonction qui ressemble à ceci
int progress_func(void* ptr, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded)
{
// It's here you will write the code for the progress message or bar
}
Et quelques options supplémentaires après les options existantes
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); // already there
// Internal CURL progressmeter must be disabled if we provide our own callback
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
// Install the callback function
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_func);
C'est tout ce qui doit être fait
J'aime la barre de progression
#include <iostream>
#include <fstream>
#include <include/curl/curl.h>//Or #include <curl/curl.h>
#include <windows.h>
#include <math.h>
using namespace std;
int nb_bar;
double last_progress, progress_bar_adv;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int progress_bar (void *bar, double t, double d)
{
if(last_progress != round(d/t*100))
{
nb_bar = 25;
progress_bar_adv = round(d/t*nb_bar);
cout<<"\r ";
SetConsoleTextAttribute(hConsole, 160);
cout<<" Progress : [ ";
if(round(d/t*100) < 10)
{ cout<<"0"<<round(d/t*100)<<" %]"; }
else
{ cout<<round(d/t*100)<<" %] "; }
SetConsoleTextAttribute(hConsole, 15);
cout<<" [";
SetConsoleTextAttribute(hConsole, 10);
for(int i = 0 ; i <= progress_bar_adv ; i++)
{ cout<<"#"; }
SetConsoleTextAttribute(hConsole, 15);
for(int i = 0 ; i < nb_bar - progress_bar_adv; i++)
{ cout<<"."; }
cout<<"]";
last_progress = round(d/t*100);
}
return 0;
}
int main()
{
CURL *curl_download;
FILE *fp;
CURLcode res;
string url = "http://www.gecif.net/articles/mathematiques/pi/pi_1_million.txt", output_file = "pi.txt";
curl_download = curl_easy_init();
if (curl_download)
{
//SetConsoleTextAttribute(hConsole, 11);
fp = fopen(output_file.c_str(),"wb");
curl_easy_setopt(curl_download, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_download, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl_download, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl_download, CURLOPT_NOPROGRESS, FALSE);
//progress_bar : the fonction for the progress bar
curl_easy_setopt(curl_download, CURLOPT_PROGRESSFUNCTION, progress_bar);
//Text color : SetConsoleTextAttribute(hConsole, nb_color);
SetConsoleTextAttribute(hConsole, 11);
cout<<" Start download"<<endl<<endl;
res = curl_easy_perform(curl_download);
fclose(fp);
if(res == CURLE_OK)
{
SetConsoleTextAttribute(hConsole, 10);
cout<<endl<<endl<<" The file was download with succes"<<endl;
}
else
{
SetConsoleTextAttribute(hConsole, 4);
cout<<endl<<endl<<" Error"<<endl;
}
curl_easy_cleanup(curl_download);
}
SetConsoleTextAttribute(hConsole, 11);
return 0;
}