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?

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top