2011-08-05 30 views
1

我正在嘗試爲我的軟件項目創建一個更新程序。我需要它能夠下載多個文件,我不介意他們是同步下載還是一個接一個地下載,無論更簡單(文件大小不是問題)。我跟着從libcurl的網頁以及其他一些資源的例子,這個想出了:在C++中使用libcurl下載多個文件

#include <iostream> 
#include <stdio.h> 
#include <curl/curl.h> 
#include <string.h> 
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written; 
    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 
int main(void){ 
    for (int i = 0; i < 2;){  //download 2 files (loop twice) 
     CURL *curl; 
     FILE *fp; 
     CURLcode res; 
     char *url = "http://sec7.org/1024kb.txt"; //first file URL 
     char outfilename[FILENAME_MAX] = "C:\\users\\grant\\desktop\\1024kb.txt"; 
     curl = curl_easy_init(); 
     if (curl){ 
      fp = fopen(outfilename,"wb"); 
      curl_easy_setopt(curl, CURLOPT_URL, url); 
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
      res = curl_easy_perform(curl); 
      curl_easy_cleanup(curl); 
      fclose(fp); 
     } 
     url = "http://sec7.org/index.html"; //I want to get a new file this time 
     outfilename[FILENAME_MAX] = "C:\\users\\grant\\desktop\\index.html"; 

    } 
    return 0; 
} 

的第一個問題是,如果我刪除新的文件分配(*url = "http://..."),只是嘗試循環的下載代碼的兩倍,該程序只是停止響應。這種情況發生在程序中不止一次調用下載的任何組合中。另一個問題是我無法更改字符數組outfilename[FILENAME_MAX]的值。我覺得這只是我正在做的一些愚蠢的錯誤,但卻沒有想到任何解決方案。謝謝!

+1

老兄,你的for循環需要'我++' –

+0

我的不好,我試圖實現其他的東西,而不是我++,我忘了添加它之前,我發佈的問題。 – llk

回答

4
  1. 爲什麼不把它放在函數中並調用它兩次?

  2. 你對數組的語法都是錯誤的,加上循環內的所有變量都是局部的,這意味着它們在每次循環迭代之後被銷燬。

  3. 什麼顯眼的編譯器說。那是什麼導致你的程序凍結;它陷入了一個無限循環,因爲i永遠不會是> 2。有關文件名和URL

    void downloadFile(const char* url, const char* fname) { 
        CURL *curl; 
        FILE *fp; 
        CURLcode res; 
        curl = curl_easy_init(); 
        if (curl){ 
         fp = fopen(fname, "wb"); 
         curl_easy_setopt(curl, CURLOPT_URL, url); 
         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
         res = curl_easy_perform(curl); 
         curl_easy_cleanup(curl); 
         fclose(fp); 
        } 
    } 
    

    ,並調用它兩次:

把你的代碼放到一個函數,像這樣

downloadFile("http://sec7.org/1024kb.txt", "C:\\users\\grant\\desktop\\1024kb.txt"); 
downloadFile("http://sec7.org/index.html", "C:\\users\\grant\\desktop\\index.html"); 

的例子功能是非常糟糕的,雖然,這只是一個例子。你應該改變它來返回錯誤代碼/拋出異常,以及類似的東西。

+1

哈哈,謝謝。有時候我會迷戀於修復我忘記簡單的小錯誤,並把它放在一個函數中。我很感謝Seth的迴應,我將詳細介紹一些錯誤處理的代碼。 – llk