2009-10-28 31 views

Respuesta

16

Su medidor.

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; 
} 
+0

¡Muchas gracias! Solo necesitaba incluir math.h y funciona bien. –

+1

@Levo, ¡me alegra que te guste! – fvu

+0

@fvu Hola Aquí implementé la manera que sugirió pero no obtuve ningún valor en esta función progress_func. – user1089679

10

Desde el curl documentation

CURLOPT_PROGRESSFUNCTION

puntero de función que debe coincidir con el prototipo curl_progress_callback encuentran en . Esta función obtiene llamada por libcurl en lugar de su equivalente interno con un intervalo frecuente de durante la operación (aproximadamente una vez por segundo) sin importar si los datos están transfiriéndose o no. Los valores de argumento desconocido/no utilizado pasados ​​ a la devolución de llamada se establecerán en cero (como si solo descargas datos, el tamaño de carga seguirá siendo 0). Si devuelve un valor distinto de cero de esta devolución de llamada hará que libcurl anule la transferencia y devuelva CURLE_ABORTED_BY_CALLBACK.

Así:

Usted proporcionar una función que tiene este aspecto

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 
} 

y algunas opciones adicionales después de las opciones existentes

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); 

Eso es todo lo que hay que hacer

+0

Mi problema es que no puedo hacer un código de trabajo para la barra de progreso. –

+0

@marios si me pongo 'curl_easy_setopt (rizo, CURLOPT_NOPROGRESS, 0); //' Instalar la función de devolución de llamada ' curl_easy_setopt (rizo, CURLOPT_PROGRESSFUNCTION, progress_func);' cuando me siento fracasado en descarga – user1089679

+2

@ user1089679 asegúrese de que está devolviendo 0 en su devolución de llamada –

0

Al igual que la barra de progreso apta

#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; 
}