Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Пример кода, который скачает файл с сайта


Автор: Nappster 7.6.2008, 03:41
Подскажите мне пожалуйста, примерчик кода, который скачает  файл с удаленного компа, например:

в edit ввожу http://www.somenet.com/file_to_download.zip далее жму кнопку Button и файл сохраняется на диск.

Спасибо!

Автор: 586 7.6.2008, 09:24
Код
#include <urlmon.h>
#pragma comment (lib, "urlmon.lib")    // $(BCB)\lib\psdk

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HRESULT hr = URLDownloadToFile(0, "http://www.somenet.com/file_to_download.zip", "C:\\file_to_download.zip", 0, 0);
    if(FAILED(hr)) {
        ShowMessage(SysErrorMessage(hr));
    }
}

$(BCB)\lib\psdk пропиши здесь: http://forum.vingrad.ru/act-Attach/type/post/id-1227241.html

Автор: Rrader 7.6.2008, 10:29
Nappster, если хочешь больше контроля, то вот примерчик:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <WinInet.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma comment(lib, "wininet.lib")
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}

class WebThread : public TThread
{
private:
    AnsiString FURL;
    AnsiString FFileName;
    void __fastcall UpdateMethod()
    {
        ShowMessage("Done!");
        return;
    }
protected:
    void __fastcall Execute();
public:
    __fastcall WebThread(bool CreateSuspended)
        :TThread(CreateSuspended)
    {
    }
    __property AnsiString URL = {read=FURL, write=FURL};
    __property AnsiString FileName = {read=FFileName, write=FFileName};
};

void __fastcall WebThread::Execute()
{
    // Session
    HINTERNET FSession = InternetOpen("Dummy", INTERNET_OPEN_TYPE_PRECONFIG,
      NULL, NULL, 0);
    // Error
    if (!FSession) return;

    HINTERNET FURL = InternetOpenUrl(FSession, URL.c_str(), NULL, 0,
      INTERNET_FLAG_RELOAD, 0);
    // Error
    if (!FURL) {
        InternetCloseHandle(FSession);
        return;
    }
    // Set Pointer 
    InternetSetFilePointer(FURL, 0, NULL, FILE_BEGIN, 0);
    TFileStream *FStream = new TFileStream(FileName, fmCreate);
    __try
    {
       DWORD BytesRead;
       char Buf[1024];
       do{
            if (InternetReadFile(FURL, Buf, sizeof(Buf) - 1, &BytesRead)){
                FStream->WriteBuffer(Buf, BytesRead);
            }
       }while (BytesRead != 0);
    }
    __finally
    {
        delete FStream;
        InternetCloseHandle(FSession);
        InternetCloseHandle(FURL);
    }
    Synchronize(&UpdateMethod);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    WebThread *Thread = new WebThread(true);
    Thread->FileName = "C:\\Black.png";
    Thread->URL = "http://wmsdk.com/imgs/Black.png";
    Thread->FreeOnTerminate = true;
    Thread->Resume();
}
//---------------------------------------------------------------------------

Автор: 586 7.6.2008, 11:02
Цитата(Rrader @  7.6.2008,  11:29 Найти цитируемый пост)
class WebThread : public TThread
{
private:
    char *FURL;
    char *FFileName;
    void __fastcall UpdateMethod()
    {
        ShowMessage("Done!");        
    }
protected:
    void __fastcall Execute();
public:
    __fastcall WebThread(bool CreateSuspended)
        :TThread(CreateSuspended)
    {
    }
    __property char* URL = {read=FURL, write=FURL};
    __property char* FileName = {read=FFileName, write=FFileName};
};

Опасный код. Особенно, если это будет указатель на String().c_str() или буфер в стеке. Замени на String.

Автор: Rrader 7.6.2008, 11:26
586, заменил на AnsiString. Так правильнее, безусловно. И логичнее.

Автор: Nappster 7.6.2008, 13:45
Спасибо большое!

Буду пробовать smile 

Автор: RDC 8.1.2009, 23:15
Код

#include <urlmon.h>
#pragma comment (lib, "urlmon.lib")    // $(BCB)\lib\psdk
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HRESULT hr = URLDownloadToFile(0, "http://www.somenet.com/file_to_download.zip", "C:\\file_to_download.zip", 0, 0);
    if(FAILED(hr)) {
        ShowMessage(SysErrorMessage(hr));
    }
}


Если использовать этот код то программа подвисает на время скачивания файла. Можно ли это исправить? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)