2009-10-28 7 views
49

में libcurl का उपयोग कर फ़ाइल डाउनलोड करें मैं एक एप्लिकेशन (देव-सी ++ का उपयोग कर विंडोज़ पर) बना रहा हूं और मैं इसे एक फ़ाइल डाउनलोड करना चाहता हूं। मैं libcurl का उपयोग कर ऐसा कर रहा हूं (मैंने पहले ही पैकमैन का उपयोग कर स्रोत कोड स्थापित किया है)। मुझे एक कामकाजी उदाहरण मिला (http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in-c-using-libcurl/) लेकिन डाउनलोड पूर्ण होने के बाद फ़ाइल बंद नहीं होती है। मैं चाहता हूं कि किसी को फ़ाइल डाउनलोड करने के तरीके पर उदाहरण दें, या तो सी या सी ++ में। अग्रिम में धन्यवाद!सी/सी ++

+6

मैं आपके सवाल का वोट बढ़ाने के लिए चाहता था, लेकिन अपने जवाब मुझे नहीं करने के लिए बनाया है। –

उत्तर

179

उदाहरण जिसका आप उपयोग कर रहे हैं वह गलत है। easy_setopt के लिए मैन पेज देखें। उदाहरण में write_data अपनी फ़ाइल का उपयोग करता है, * आउटफाइल, और FP जो CURLOPT_WRITEDATA में निर्दिष्ट नहीं था। यही कारण है कि बंद एफपी समस्याओं का कारण बनता है - यह भी खोला नहीं है।

यह वह जगह है और अधिक या कम यह कैसा (कोई libcurl यहाँ उपलब्ध परीक्षण करने के लिए) दिखना चाहिए

#include <stdio.h> 
#include <curl/curl.h> 
/* For older cURL versions you will also need 
#include <curl/types.h> 
#include <curl/easy.h> 
*/ 
#include <string> 

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

int main(void) { 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    char *url = "http://localhost/aaa.txt"; 
    char outfilename[FILENAME_MAX] = "C:\\bbb.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); 
     /* always cleanup */ 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    return 0; 
} 

अपडेट किया गया: के रूप में @rsethc types.h और easy.h ने सुझाव दिया वर्तमान cURL संस्करणों में मौजूद नहीं हैं अब और।

+1

मैंने कोशिश की (तहत OSX) इस लेकिन मैं हो रही है: "___gxx_personality_v0", से संदर्भित: चेतावनी: करने के लिए 'चार *' अपरिभाषित प्रतीकों निरंतर स्ट्रिंग से पदावनत रूपांतरण ccHRyU1T.o write_data में _main (शून्य *, ccHRyU1T.o सीसीई में ccHRyU1T.o ld: प्रतीक नहीं मिला संग्रह 2: एलडी 1 निकास स्थिति कृपया मदद करें !! – TCB13

+0

@ टीसीबी 13 कार्यक्रम मैंने लिखा है सी है, सी ++ नहीं। सी के रूप में पुन: संकलित करें और समस्याओं को दूर जाना चाहिए। – fvu

+8

+1 क्योंकि मुझे विश्वास है कि ओपी को इसे उत्तर के रूप में चुना जाना चाहिए था, क्योंकि कोड काफी समान है। – alexy13

14

बस रुचि रखने वालों के लिए आप अंतिम पैरामीटर के रूप में NULL को पारित करके कस्टम फ़ंक्शन लिखने से बच सकते हैं (यदि आप लौटाए गए डेटा की अतिरिक्त प्रसंस्करण करने का इरादा नहीं रखते हैं)।
इस मामले में डिफ़ॉल्ट आंतरिक फ़ंक्शन का उपयोग किया जाता है।

विवरण
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA

उदाहरण

#include <stdio.h> 
#include <curl/curl.h> 

int main(void) 
{ 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    char *url = "http://stackoverflow.com"; 
    char outfilename[FILENAME_MAX] = "page.html"; 
    curl = curl_easy_init();                                                               
    if (curl) 
    { 
     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     res = curl_easy_perform(curl); 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    return 0; 
} 
+0

यह काम नहीं करता है विंडोज़। विंडोज़ पर आपको सेट करना होगा CURLOPT_WRITEFUNCTION गैर-शून्य अन्यथा एक क्रैश होता है। Https://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html –

+0

@ फिलिलसेनबर्ग अच्छी तरह से दुर्भाग्यपूर्ण लगता है, क्योंकि यहां https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION देखें।एचटीएमएल # विवरण यह स्पष्ट रूप से बताता है: "इस कॉलबैक के बजाय आंतरिक डिफ़ॉल्ट फ़ंक्शन का उपयोग करने के लिए इस विकल्प को NULL पर सेट करें।" तो यह "यदि आप Win32 DLL के रूप में libcurl का उपयोग कर रहे हैं, तो आपको CURLOPT_WRITEFUNCTION का उपयोग करना होगा यदि आप यह विकल्प सेट करते हैं या आप दुर्घटनाओं का अनुभव करेंगे। " इसका कोई प्रभाव नहीं होना चाहिए, क्योंकि फिर से आंतरिक कार्य का उपयोग किया जाना चाहिए। – Petar

संबंधित मुद्दे