2012-05-16 9 views
5

का उपयोग करके मैं gtk libs का उपयोग कर वेब से एक फ़ाइल कैसे प्राप्त करूं?वेब से एक फ़ाइल प्राप्त करें: जी 0K में सी

अगर मेरे फ़ाइल से है:

gchar * पथ = "http: //xxx.yyyServer/sharing/temp.txt"

मैं क्या इसे डाउनलोड करने के क्या करना चाहिए?

स्थानीय फ़ाइलों के लिए मैं बस सी पुस्तकालयों जैसे फॉपेन और फ्रेड का उपयोग करता हूं।

मुझे उपर्युक्त कैसे करना चाहिए?

दुर्भाग्य से ट्यूटोरियल में फ़ाइल हैंडलिंग का कोई उदाहरण नहीं है। मैं केवल फाइल संवाद बॉक्स से फ़ाइल चयनकर्ता देख सकता हूं।

कृपया इस नोब की मदद करें।

धन्यवाद

टिप्पणियाँ से काम कर कोड से अपडेट: नीचे कोड अज्ञात आकार के द्विआधारी फ़ाइलों के लिए काम करता है।

char *name= http://127.0.0.1:8000/mybinfile 


int getFile(char *name) 
{ 

    GFile *f = g_file_new_for_uri(name); 
    GFileInputStream *fis = NULL; 
    GDataInputStream* dis = NULL; 
    GError *err = NULL; 
    //char buffer[2048]; 
    char *buffer; 
    size_t length; 
    int ret = -1; 

    GFileInfo *info; 

    int total_size = -1; 

    /* get input stream */ 
    fis = g_file_read(f, NULL, &err); 

    if (err != NULL) { 
     fprintf(stderr, "ERROR: opening %s\n", name); 
     g_object_unref(f); 
     return -1; 
    } 

    info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (fis),G_FILE_ATTRIBUTE_STANDARD_SIZE,NULL, &err); 
    if (info) 
    { 
     if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) 
      total_size = g_file_info_get_size (info); 
      printf("total_size = %d\n", total_size); 
      g_object_unref (info); 
    } 

    // fill buffer 
    if(total_size > 0){ 
     buffer = (char *) malloc(sizeof(char) * total_size); 
     memset(buffer, 0, total_size); 
     if ((length = g_input_stream_read (G_INPUT_STREAM(fis), 
        buffer, total_size, NULL, &err)) != -1) { 
       printf("reading file\n"); 
     } 
     printf("File length = %d\n", length); 

      ret = 0; 
     } 
     // close streams 
     g_object_unref(fis); 
     g_object_unref(f); 
     return ret; 
    } 
+4

कर्ल नौकरी कर सकता है। – nullpotent

+0

एक गंदे हैक के बारे में कैसे? int meh = system ("wget" + name); – Mikhail

उत्तर

11

HTTP जीआईओ द्वारा समर्थित प्रोटोकॉल में से एक है, इसलिए आप मानक सी कार्यों के बजाय जीआईओ फ़ंक्शंस का उपयोग करते समय किसी भी अन्य फ़ाइल की तरह एक HTTP यूआरआई खोल सकते हैं। फ़ाइल ऑब्जेक्ट बनाने के लिए बस g_file_new_for_uri का उपयोग करें और फिर आप इसे स्थानीय फ़ाइल की तरह पढ़ सकते हैं।

आप g_file_read का उपयोग दिया यूआरआई के लिए एक GFileInputStream प्राप्त करने के लिए कर सकते हैं और फिर g_data_input_stream_new इनपुट धारा, जिसे फिर आप फ़ाइल पंक्ति-दर-पंक्ति को पढ़ने के लिए उपयोग कर सकते हैं के लिए एक GDataInputStream मिलता है। इससे पहले कि आप इसे g_data_input_stream_new (या इससे पहले कि आप इसके साथ कुछ भी उपयोगी कर सकें) को पास कर सकें, लेकिन यदि आप सी में जीटीके प्रोग्रामिंग कर रहे हैं, तो आपको GFileInputStream को GINputStream में अपनाना होगा, लेकिन शायद आप अब तक इसका उपयोग कर रहे हैं।

+0

धन्यवाद sepp2k। मैं इसे आजमाने के लिए जा रहा हूं और एक बार जब कोड पोस्ट करता है तो इसे पोस्टरिटी के लिए पोस्ट किया जाता है;) – user907810

+0

इसे पढ़ने के लिए उपयुक्त बफर आवंटित करने से पहले मुझे फ़ाइल का आकार पहले से कैसे प्राप्त किया जा सकता है? सी में मैं fseek और ftell का उपयोग कर ऐसा करूँगा। क्या यह जीटीके में संभव है? – user907810

+0

@ user907810 आप फ़ाइल ऑब्जेक्ट से GFileInfo ऑब्जेक्ट प्राप्त कर सकते हैं और फिर g_file_info_get_size पर कॉल कर सकते हैं। – sepp2k

-1

मैं एक noob हूँ केवल आपके जीटीके साथ (शायद और भी अधिक), लेकिन मुझे लगता है कि वहाँ एक "एक अनुदेश" C++/सी में एक फ़ाइल डाउनलोड करने का तरीका नहीं है कि के रूप में। आपको बाहरी उपकरण (wget, आदि) का उपयोग करना होगा या स्वयं एक जीईटी प्रक्रिया लिखना होगा। Here libcurl का उपयोग कर सी में फ़ाइल डाउनलोड का एक उदाहरण है। सौभाग्य!

+0

gtk प्रलेखन से ईमानदार होने के लिए, मैंने फ़ाइल चयनकर्ता संवाद को छोड़कर फ़ाइल हैंडलिंग का कोई उदाहरण नहीं देखा और इसलिए स्थानीय फाइलों को पढ़ने के लिए भी मैंने सी शैली फ़्रेड के साथ कोड किया ... – user907810

+0

libcurl का उपयोग करने में एकमात्र समस्या है, मेरे पास है libcurl पुस्तकालय भी स्थापित करने के लिए। वास्तव में मैं एक एम्बेडेड एआरएम अनुप्रयोग के लिए प्रोग्रामिंग कर रहा हूं और यदि यह lib डिफ़ॉल्ट रूप से अनुपलब्ध है तो मुझे इसे संकलित करना होगा .. – user907810

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