datei herunter laden



  • moien,
    wie kann ich eine datei herunter laden?
    von google.de/index.htm auf C:\ oder so

    danke



  • Vielleicht kannst du mit folgendem Auszug aus einem Mini-Projekt von mir was anfangen:

    __fastcall TDownloadThread::TDownloadThread(bool CreateSuspended,
                                                AnsiString loadFromUrl,
                                                AnsiString saveToFileName,
                                                TForm* form,
                                                HWND progressBar)
        : TThread(CreateSuspended)
    {
       LoadFromURL = loadFromUrl;
       SaveToFileName = saveToFileName;
       UpdateForm = form;
       hProgressBar = progressBar;
    
       FreeOnTerminate = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::Execute()
    {
       DownloadFile();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::DownloadFile()
    {
        HINTERNET hInternet;
        HINTERNET hFile;
        HGLOBAL   hGlobal;
        FILE*     fFile;
        CHAR*     szBuf;
        BOOL      bGO = TRUE;
        DWORD     dwReadSize = 256;
        CHAR      lpszFileSize[15];
        INT       iStep;
        DWORD     dwDummy;
        TCHAR     szErrBuf[256];
        LPCTSTR   httpFile = LoadFromURL.c_str();
        LPCTSTR   targetFile = SaveToFileName.c_str();
    
        // Internet API initialisieren und Handle auf das File bekommen
        hInternet = InternetOpen("WinINet Sample Program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
        if(!hInternet)
        {
           ShowLastErrorString();
           return;
        }
        hFile = InternetOpenUrl(hInternet, httpFile, NULL, 0, INTERNET_FLAG_RELOAD, 0);
        if(!hFile)
        {
           ShowLastErrorString();
           InternetGetLastResponseInfo(&dwDummy, szErrBuf, &dwReadSize);
           MessageBox(NULL, szErrBuf, "Error", MB_OK | MB_ICONINFORMATION);
           InternetCloseHandle(hInternet);
           return;
        }
    
        // Größe des Files herausbekommen
        dwDummy = 15;
        HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, (LPVOID)lpszFileSize, &dwDummy, NULL);
        FileSize = atoi(lpszFileSize);
        if(FileSize == 0)
        {
           MessageBox(NULL, "The file you want to download doesn't exist\nor has file size zero",
                      "ERROR", MB_OK|MB_ICONERROR);
           InternetCloseHandle(hFile);
           InternetCloseHandle(hInternet);
           return;
        }
        iStep = (FileSize / 100 == 0) ? 1 : FileSize / 100;
    
        // Speicher für den Buffer allokieren
        hGlobal = GlobalAlloc(GMEM_FIXED, iStep + 1);
        szBuf = (CHAR*)GlobalLock(hGlobal);
    
        // Das File downloaden
        fFile = fopen(targetFile, "w+b");
        while(bGO)
        {
            if(Stopped)
               break;
            bGO = InternetReadFile(hFile, szBuf, iStep, &dwReadSize);
            if(bGO && dwReadSize == 0)
               break;
            szBuf[dwReadSize] = '\0';
            fwrite(szBuf, 1, dwReadSize, fFile);
            DownloadedBytes += iStep;
            Synchronize(Callback);
        }
        fclose(fFile);
    
        // Handles schließen und aufräumen
        GlobalUnlock(hGlobal);
        GlobalFree(hGlobal);
        InternetCloseHandle(hFile);
        InternetCloseHandle(hInternet);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::Callback()
    {
       float fFileSize = (float)FileSize;
       float fDownloadedBytes = (float)DownloadedBytes;
       int iPercent = (int)((fDownloadedBytes / fFileSize) * 100.);
    
       UpdateForm->Caption = (AnsiString)iPercent
                             + (AnsiString)"% of "
                             + SaveToFileName
                             + (AnsiString)" downloaded";
       Application->Title = UpdateForm->Caption;
       SendMessage(hProgressBar, PBM_SETPOS, iPercent, 0);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::ShowLastErrorString()
    {
        LPVOID lpMsgBuf;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                      FORMAT_MESSAGE_FROM_SYSTEM |
                      FORMAT_MESSAGE_IGNORE_INSERTS,
                      NULL,
                      GetLastError(),
                      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                      (LPTSTR)&lpMsgBuf,
                      0,
                      NULL
                     );
        MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION);
        LocalFree(lpMsgBuf);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::Stop()
    {
       Stopped = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TDownloadThread::DoTerminate()
    {
       TThread::DoTerminate();
    
       if(DownloadedBytes < FileSize)
       {
          int ans = MessageBox(UpdateForm->Handle,
                               "The file has not been completely downloaded.\
                               \nDo you want it to be deleted?",
                               "Information",
                               MB_YESNO|MB_ICONINFORMATION);
          if(ans == IDYES)
             DeleteFile(SaveToFileName.c_str());
       }
    }
    //---------------------------------------------------------------------------
    

    Ach ja, du musst WinInet.lib dazulinken.



  • Oder mit der Indy-Komponente IdHTTP etwas kürzer:

    HTTP->HandleRedirects=true; // die  IdHTTP Komponente
    String Seite=HTTP->Get("http://www.xxxxxxx.de");
    


  • Oder so:

    #include "windows.h"
    #include "urlmon.h"
    #pragma comment (lib, "C:\urlmon.lib")
    URLDownloadToFile(0, "http://abc.de/ab.exe", "C:\\Open.html", 0, 0);
    


  • wobei

    #pragma comment (lib, "C:\urlmon.lib")
    

    nur etwas von mir ist da müsstest du gucken wo deine urlmon.lib liegt



  • hmm...
    wenn ich das mit der urlmon.lib nehme, und die urlmon.lib wie bei dir auf laufwerk C:/ liegt, muss dann bei jedem, den man das programm gibt nicht auch die urlmon.lib auf C:/ rumgammeln, damit es funzt?



  • Du kannst ja die lib mit dem Programm weitergeben und in dem selbem Ordner speichern. Danach kannst Du sie ja mit Application->ExeName... einbinden.

    Die Variante von Christian211(1) ist aber meines Erachtens nach die beste und unkomplizierteste.

    Gruss



  • nein die urlmon.lib muss nicht mitgegeben werden die wird so mit eincompiliert


Anmelden zum Antworten