gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:08:57 25 4
gpt4 key购买 nike

我应该使用什么函数使用 GLib/GIO 库从网络上获取文件?

如果我的文件来自:

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

我应该怎么做才能下载它?

对于本地文件,我只使用 C 库,如 fopen 和 fread。

我应该怎么做?

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


根据评论更新工作代码:下面的代码适用于未知大小的二进制文件。

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 支持的协议(protocol)之一,因此在使用 GIO 函数而不是标准 C 函数时,您可以像打开任何其他文件一样打开 HTTP URI。只需使用 g_file_new_for_uri创建文件对象,然后您就可以像读取本地文件一样读取它。

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

关于c - 使用 C 中的 GLib/GIO 从 Web 获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com