2013-08-17 60 views
0

我試圖找到一種方法來下載文件,讓程序等待下載完成,然後移到下一個任務,在這種情況下將檢查是否文件存在C++完成當前的任務,然後繼續下一個

#include <stdio.h> 
#include <curl/curl.h> 
#include <curl/easy.h> 
#include <string> 
#include <iostream> 
#include <stdlib.h> 
#include <fstream> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 
using namespace std; 

int main(void) { 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    char *url = "http://199.91.153.180/y1plsynnb11g/e9g9mcd3fi5txov/UHC.jar"; 
    char outfilename[FILENAME_MAX] = "UHC.jar"; 
    curl = curl_easy_init(); 
    if (curl) { 
     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, "http://199.91.153.180/y1plsynnb11g/e9g9mcd3fi5txov/UHC.jar"); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     res = curl_easy_perform(curl); 
     /* always cleanup */ 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    ofstream launch; 
    launch.open("UHC.jar"); 
    if (launch.is_open()){ 
     cout<< "File Downloaded"; 
    } 
    else { 
     cout << "Download Failed"; 
    } 
} 
+2

不要使用'char *'指向一個字符串,使用'const char *'。 – chris

+1

此代碼應完全按照您的描述進行。在操作完成之前,'curl_easy_perform'不應該返回。所以有什麼問題? –

+0

問題是,一旦它完成它說文件下載然後文件只是空的 –

回答

0

我只是意識到什麼是錯的,當它來檢查使用的ofstream它試圖寫它,因此它將使現有的文件該文件爲空。只需將它從stefan改爲fstream就可以完美運作。

0

HTTP請求可能失敗。嘗試添加錯誤檢查之前/ *總是清理*/

if (res) 
    cout << curl_easy_strerror(res) << endl; 
+0

它沒有工作...剛剛結束相同 –

0

我意識到write_data的返回值是錯誤的。但也應該引起錯誤... 總之,請嘗試:

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) { 
    size_t written = fwrite(ptr, size, nmemb, stream); 
    return written * size; 
} 
+0

它確實創建了一個錯誤,但我不理會它。沒有更多的錯誤,但仍然是我的原始問題它只是下載一個空文件。 –

相關問題