从Web获取文件:在GTK中使用C

我应该使用什么函数使用gtk libs从Web获取文件?

如果我的文件来自:

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

我该怎么做才能下载它?

对于本地文件,我只使用像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; } 

HTTP是GIO支持的协议之一,因此在使用GIOfunction而不是标准Cfunction时,您可以像打开任何其他文件一样打开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,你可能已经习惯了。

我和GTK一样是一个菜鸟(可能更多),但我怀疑没有一种“单指令”的方式来下载C / C ++中的文件。 您必须使用外部工具(wget等)或自己编写GET程序。 以下是使用libcurl在C中下载文件的示例。 祝好运!