Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[URLDownloadToFile] Jak wykonać 'progressbara' obrazującego postęp pobrania pliku?

Ostatnio zmodyfikowano 2012-02-12 17:41
Autor Wiadomość
tomcionek15
Temat założony przez niniejszego użytkownika
[URLDownloadToFile] Jak wykonać 'progressbara' obrazującego postęp pobrania pliku?
» 2012-02-11 17:12:59
Witam dzisiaj jeszcze z pomoca tego forum udalo mi sie zrobic poobieranie pliku.
A moje pytanie brzmi jak wykonac progress bar'a to pobieranego pliku
w sensie ze pokazuje np tak :
|==========                     | 36%

moj obecny kod to :
C/C++
#include <iostream>
#include <conio.h>
#include <urlmon.h>
#include <string>
#pragma comment(lib, "urlmon.lib")

using namespace std;

void Pobierz( string link, string fol_docel )
{
    string link_s = link;
    string save_s = fol_docel;
   
    if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, NULL ) == S_OK )
    {
        cout << "Pobieranie pliku : \n" << link << " \n Zakonczone pomyslnie. ";
    }
    else
    {
        cout << "Pobieranie pliku : \n" << link << " \n Zakonczone NIEpowodzeniem. ";
    }
}
int main()
{
    string links;
    string fol_doc;
    cout << "Podaj link do pliku : ";
    cin >> links;
    cout << endl << "Podaj Folder docelowy(+nazwa pliku i .rozszerzenie): ";
    cin >> fol_doc;
    cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl;
    Pobierz( links, fol_doc );
    getch();
}
I chcialbym zeby bylo w linijce :
C/C++
cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl;
zamaist tych endl po "Czekaj, twa pobieranie pliku ", byl ten progress bar :D

Z groy dziekuje pozdrawiam :D
P-50543
pekfos
» 2012-02-11 17:21:30
A może by tak poczytać dokumentację urlmona? Jak o wszystko chcesz pytać to daruj sobie..
P-50544
tomcionek15
Temat założony przez niniejszego użytkownika
» 2012-02-11 17:50:27
Gdyby na forum byla ta dkomentacja Daje 'Dokumntacja' i szukam urlmon -> Nie ma szukam w Google -> Nie ma
P-50546
malan
» 2012-02-11 18:10:03
To jest do zrobienia za pomocą URLDownloadToFile, ale musisz wiedzieć m.in co to są: klasy, dziedziczenie, metody wirtualne, interface i jak się tym poprawnie posługiwać.
P-50547
tomcionek15
Temat założony przez niniejszego użytkownika
» 2012-02-12 10:54:28
C/C++
#include <iostream>
#include <conio.h>
#include <urlmon.h>
#include <string>
#include <cstdlib>
#pragma comment(lib, "urlmon.lib")

using namespace std;

string nazwa_pliku;
class MyCallback
    : public IBindStatusCallback
{
public:
    MyCallback() { }
   
    ~MyCallback() { }
   
    STDMETHOD( OnProgress )( /* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText )
    {
        if( ulStatusCode != 5 )
        {
            cout << "Czekaj, trwa sprawdzanie pliku. : " << nazwa_pliku << "\r";
            return S_OK;
        }
        else
        {
            cout << "Pobrano " << ulProgress / 1024 << " KB z " << ulProgressMax / 1024 << " KB, Nazwa Pliku = " << nazwa_pliku << ", Status Code = " << ulStatusCode << "\r";
            return S_OK;
        }
    }
   
    STDMETHOD( OnStartBinding )( /* [in] */ DWORD dwReserved, /* [in] */ IBinding __RPC_FAR * pib )
    { return E_NOTIMPL; }
   
    STDMETHOD( GetPriority )( /* [out] */ LONG __RPC_FAR * pnPriority )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnLowResource )( /* [in] */ DWORD reserved )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnStopBinding )( /* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError )
    { return E_NOTIMPL; }
   
    STDMETHOD( GetBindInfo )( /* [out] */ DWORD __RPC_FAR * grfBINDF, /* [unique][out][in] */ BINDINFO __RPC_FAR * pbindinfo )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnDataAvailable )( /* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC __RPC_FAR * pformatetc, /* [in] */ STGMEDIUM __RPC_FAR * pstgmed )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnObjectAvailable )( /* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown __RPC_FAR * punk )
    { return E_NOTIMPL; }
   
    STDMETHOD_( ULONG, AddRef )()
    { return 0; }
   
    STDMETHOD_( ULONG, Release )()
    { return 0; }
   
    STDMETHOD( QueryInterface )( /* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR * __RPC_FAR * ppvObject )
    { return E_NOTIMPL; }
};
MyCallback pCallback;
void Pobierz( string link, string fol_docel )
{
    string link_s = link;
    string save_s = fol_docel;
   
    if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, & pCallback ) == S_OK )
    {
        cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Pomyslnie. \n";
    }
    else
    {
        cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Niepowodzeniem. \n";
    }
}
int main()
{
    string links;
    string fol_doc;
    cout << "Podaj link do pliku : ";
    cin >> links;
    cout << endl << "Podaj Folder docelowy : ";
    cin >> fol_doc;
    cout << "Podaj nazwe pliku(+ .rozszerzenie) : ";
    cin >> nazwa_pliku;
    cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl;
   
    fol_doc += nazwa_pliku;
    Pobierz( links, fol_doc );
    system( "PAUSE" );
    return 0;
}

Mam taki kod i narazie wszystko dziala tylko za chiny nie wiem jak zrobic ten progress bar
|========               | 36%

P-50565
szyx_yankez
» 2012-02-12 11:26:05
Mając informacje o rozmiarze pliku i aktualnym stanie można to zrobić bardzo prosto, kłania się podstawowa znajomość pętli i matematyki, np:
C/C++
#include <iostream>
#include <windows.h>

using namespace std;

float ulProgressMax = 10000; //wielkosc pliku
float ulProgress = 0; //aktualny stan pobierania

int IL = 50; // ilosc znakow '=' przypadajacych na 100%
int main()
{
    while( true )
    {
        ulProgress++;
       
        cout << "|";
        for( int i = 0; i < int( ulProgress / ulProgressMax * IL ); i++ )
             cout << "=";
       
        for( int i = int( ulProgress / ulProgressMax * IL ); i < IL; i++ )
             cout << " ";
       
        cout << "|";
        cout << int( ulProgress / ulProgressMax * 100 ) << "%\r";
       
        Sleep( 1 );
       
        if( ulProgress >= ulProgressMax ) break;
       
    } cout << "Pobrano!"; Sleep( 2000 );
   
    return 0;
}
P-50567
tomcionek15
Temat założony przez niniejszego użytkownika
» 2012-02-12 14:05:26
Dzięki działa ale mam problem :

C/C++
#include <iostream>
#include <conio.h>
#include <urlmon.h>
#include <string>
#include <cstdlib>
#pragma comment(lib, "urlmon.lib")

using namespace std;
int IL = 60;
string nazwa_pliku;
string links;
string fol_doc;
float upr;
float uprm;

class MyCallback
    : public IBindStatusCallback
{
public:
    MyCallback() { }
   
    ~MyCallback() { }
   
    STDMETHOD( OnProgress )( /* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR wszStatusText )
    {
        if( ulStatusCode != 5 )
        {
            cout << "Czekaj, trwa sprawdzanie pliku. : " << nazwa_pliku << "\r";
            return S_OK;
        }
        else
        {
            cout << "\nPobrano " << ulProgress / 1024 << " KB z " << ulProgressMax / 1024 << " KB, Nazwa Pliku = " << nazwa_pliku << ", Status Code = " << ulStatusCode << "\r";
            cout << endl;
            while( true )
            {
               
                upr = ulProgress;
                uprm = ulProgressMax;
                upr++;
                cout << "|";
                for( int i = 0; i < int( upr / uprm * IL ); i++ )
                {
                    cout << "=";
                }
               
                for( int i = int( upr / uprm * IL ); i < IL; i++ )
                {
                    cout << " ";
                }
               
                cout << "|";
                cout << int( upr / uprm * 100 ) << "%" << "\r";
                if( upr >= uprm ) break;
               
                Sleep( 1 );
                return S_OK;
            }
           
            return S_OK;
        }
    }
   
    STDMETHOD( OnStartBinding )( /* [in] */ DWORD dwReserved, /* [in] */ IBinding __RPC_FAR * pib )
    { return E_NOTIMPL; }
   
    STDMETHOD( GetPriority )( /* [out] */ LONG __RPC_FAR * pnPriority )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnLowResource )( /* [in] */ DWORD reserved )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnStopBinding )( /* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError )
    { return E_NOTIMPL; }
   
    STDMETHOD( GetBindInfo )( /* [out] */ DWORD __RPC_FAR * grfBINDF, /* [unique][out][in] */ BINDINFO __RPC_FAR * pbindinfo )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnDataAvailable )( /* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC __RPC_FAR * pformatetc, /* [in] */ STGMEDIUM __RPC_FAR * pstgmed )
    { return E_NOTIMPL; }
   
    STDMETHOD( OnObjectAvailable )( /* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown __RPC_FAR * punk )
    { return E_NOTIMPL; }
   
    STDMETHOD_( ULONG, AddRef )()
    { return 0; }
   
    STDMETHOD_( ULONG, Release )()
    { return 0; }
   
    STDMETHOD( QueryInterface )( /* [in] */ REFIID riid, /* [iid_is][out] */ void __RPC_FAR * __RPC_FAR * ppvObject )
    { return E_NOTIMPL; }
};
MyCallback pCallback;

void sciezka( string fol_doc, string nazwa_pliku )
{
    string sciezka = fol_doc += nazwa_pliku;
   
    cout << "\n\n Plik zostal pobrany do : " << sciezka;
}

void Pobierz( string link, string fol_docel )
{
    string link_s = link;
    string save_s = fol_docel;
   
    if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, & pCallback ) == S_OK )
    {
        cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Pomyslnie. \n";
        sciezka( fol_doc, nazwa_pliku );
    }
    else
    {
        cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Niepowodzeniem. \n";
    }
}

int main()
{
    cout << "Podaj link do pliku : ";
    cin >> links;
    cout << endl << "Podaj Folder docelowy : ";
    cin >> fol_doc;
    cout << "Podaj nazwe pliku(+ .rozszerzenie) : ";
    cin >> nazwa_pliku;
    cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl;
   
    fol_doc += nazwa_pliku;
    Pobierz( links, fol_doc );
    system( "PAUSE" );
    return 0;
}

Działa ale jest pewny problem .....

pokazuje :
Pobrano 565kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|========================                         |56%
Pobrano 665kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|==============================                |66%
Pobrano 695kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|================================              |70%
Pobrano 765kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|==================================             |76%
Pobrano 795kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|====================================            |79%
Pobrano 855kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|========================================       |85%
Pobrano 965kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|=============================================  |96%

A chce zeby to pokazywalo caly czas w 2 linijkach:

Pobrano 565kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|========================                                      |56%

P.S : Nie dziala to :   
cout <<[..] << "\r";

Sorka że to tak pokazuje ale normalnie to jest [równe]
P-50572
szyx_yankez
» 2012-02-12 14:32:41
Czyść ekran za każdym obiegiem pętli...
P-50573
« 1 » 2
  Strona 1 z 2 Następna strona