2012-05-16 8 views
5

¿Con qué función debo buscar un archivo de la web usando gtk libs?Obtener un archivo de la web: en GTK usando C

Si mi archivo es de:

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

¿Qué debo hacer para descargarlo?

Para los archivos locales, simplemente uso las bibliotecas C como fopen y fread.

¿Cómo debo hacer lo anterior?

Desafortunadamente no hay ejemplos de manejo de archivos en los Tutoriales. Solo puedo ver un selector de Archivo desde los cuadros de diálogo Archivo.

Por favor, ayuda este novato.

Gracias

ACTUALIZADO CON CODIGO DE TRABAJO DE COMENTARIOS: El código siguiente funciona para archivos binarios de tamaños desconocidos.

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

CURL podría hacer el trabajo. – nullpotent

+0

¿Qué tal un truco sucio? int meh = system ("wget" + nombre); – Mikhail

Respuesta

11

HTTP es uno de los protocolos admitidos por GIO, por lo que puede abrir un URI HTTP al igual que cualquier otro archivo cuando usa las funciones GIO en lugar de las funciones C estándar. Simplemente use g_file_new_for_uri para crear el objeto de archivo y luego puede leerlo como un archivo local.

Puede utilizar g_file_read para obtener una GFileInputStream para el URI y luego g_data_input_stream_new para obtener una GDataInputStream para el flujo de entrada, que luego se puede utilizar para leer la línea línea por archivo. Tienes que subir el GFileInputStream a un GInputStream antes de que puedas pasarlo al g_data_input_stream_new (o antes de que puedas hacer algo útil con él), pero si estás programando GTK en C, probablemente ya estés acostumbrado a eso.

+0

Gracias sepp2k. Voy a probarlo y una vez que el código funcione, publícalo para la posteridad;) – user907810

+0

¿Cómo obtengo el tamaño del archivo por adelantado antes de asignar un buffer adecuado para leerlo? En C, haría esto usando fseek y ftell. ¿Es esto posible en GTK? – user907810

+0

@ user907810 Puede obtener un objeto GFileInfo del objeto de archivo y luego llamar a g_file_info_get_size en él. – sepp2k

-1

soy un novato del mismo modo que con GTK (tal vez incluso más), pero sospecho que no es una forma de "una sola instrucción" para descargar un archivo en C/C++. Debe usar herramientas externas (wget, etc.) o escribir un procedimiento GET usted mismo. Here es un ejemplo de descarga de archivos en C que utiliza libcurl. ¡Buena suerte!

+0

Para ser honesto, de la documentación de gtk no vi ejemplos de manejo de archivos a excepción de un cuadro de diálogo de selección de archivos y, por lo tanto, incluso para leer archivos locales, simplemente codifiqué el estilo C fread ... – user907810

+0

El único problema con el uso de libcurl es para instalar la biblioteca libcurl también. En realidad estoy programando para una aplicación ARM incrustada y si esta lib no está disponible por defecto, entonces tengo que compilarla cruzada ... – user907810

Cuestiones relacionadas