使用C中的GLib/GIO从Web获取文件

use*_*810 7 c url glib

我应该使用什么功能使用GLib/GIO库从Web获取文件?

如果我的文件来自:

gchar *path = "http://xxx.yyyServer/sharing/temp.txt"
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能下载它?

对于本地文件,我只使用像fopen和fread这样的C库.

我该怎么办?

遗憾的是,教程中没有文件处理的例子.我只能从文件对话框中看到文件选择器.


使用注释中的工作代码更新:以下代码适用于未知大小的二进制文件.

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;
    }
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 11

HTTP是GIO支持的协议之一,因此在使用GIO功能而不是标准C功能时,您可以像打开任何其他文件一样打开HTTP URI.只需使用g_file_new_for_uri创建文件对象,然后就可以像本地文件一样阅读它.

您可以使用g_file_read获取给定URI的GFileInputStream,然后g_data_input_stream_new获取输入流的GDataInputStream ,然后您可以使用该GDataInputStream逐行读取文件.你必须将GFileInputStream向上转换为GInputStream才能传递给它g_data_input_stream_new(或者你可以用它做任何有用的事情之前),但是如果你用C语言编写GTK,那么你现在可能已经习惯了.