Je voudrais qu'une barre de progression apparaisse dans la fenêtre de la console lorsqu'un fichier est en cours de téléchargement. Mon code est: Télécharger le fichier à l'aide de libcurl en C / C ++ A >. p>
Comment avoir une barre de progression à libcurl? p>
3 Réponses :
à partir du Curl Documentation
curlopt_progressfunction p>
Pointeur de fonction qui devrait correspondre à la curl_progress_callback prototype trouvé dans . Cette fonction obtient appelé par libcurl au lieu de sa équivalent interne avec un fréquent intervalle pendant le fonctionnement (grossièrement une fois par seconde), peu importe si les données sont être transféré ou non. Les valeurs d'argumentation inconnues / inutilisées ont passé au rappel sera réglé sur zéro (comme si vous téléchargez uniquement des données, le La taille de téléchargement restera 0). Retournant une valeur non nulle de ce rappel causera libcurl à abandonner la Transfert et retour Curle_Aborted_by_callback. P> blockQuote>
SO: P>
Vous fournissez une fonction qui ressemble à ce p>
xxx pré> et quelques options supplémentaires après les options existantes p >
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);
Mon problème est que je ne peux pas créer de code de travail pour la barre de progression.
@marios si i mettre curl_easy_setopt (curl, curlopt_noprogress, 0); code> // Installez la fonction de rappel
curl_easy_setopt (curl, curlopt_progressfunction, progress_func); code> alors j'ai échoué dans le téléchargement
@ user1089679 Assurez-vous que vous retournez 0 dans votre rappel
votre compteur.
#include <math.h> 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 = (int) 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; }
Merci beaucoup! J'ai juste besoin d'inclure les maths.h et ça marche bien.
@fvu salut ici j'ai mis en œuvre la manière que vous avez suggérée, mais je n'ai pas eu de valeur dans cette fonction progress_func.
Belle que j'ai adapté cela à c fonctionne très très très bien!
@workDreamer content de l'avoir aimé, mais je suis un peu perplexe, le code ci-dessus est i> c;)
@workDreamer Merci pour la modification! Si vous utilisez php, consultez également PhpClimate pour un moyen simple de faire un bar même fantaisiste :)
La lib est intéressante. Peut-être que je vais l'utiliser plus tard. Maintenant j'utilise votre code :)
Like APT Progress Bar
#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; }