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

2024-02-07

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

如果我的文件来自:

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 支持的协议之一,因此当使用 GIO 函数而不是标准 C 函数时,您可以像打开任何其他文件一样打开 HTTP URI。只需使用g_file_new_for_uri http://developer.gnome.org/gio/stable/GFile.html#g-file-new-for-uri创建文件对象,然后您可以像本地文件一样读取它。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 一个好的数据库建模工具? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将我在提交中更改的行中的空格转换为制表符

    我已经对 git repo 进行了相当大的提交 更改了 60 个文件 插入了 1635 个 删除了 3 个 现在我意识到我使用了空格进行缩进 而其余代码则使用了制表符 因此 我想替换制表符的空格 但仅限于该提交更改的行 因为我不想修改可能使
  • Kube-Proxy-Windows CrashLoopBackOff

    安装过程 我是 Kubernetes 的新手 目前正在 Azure VM 内设置 Kubernetes 集群 我想部署 Windows 容器 但为了实现此目的 我需要添加 Windows 工作节点 我已经部署了一个具有 3 个主节点和 1
  • 通过 Powershell 进行智能图像搜索

    我对按自定义属性搜索文件感兴趣 例如 我想查找具有特定尺寸的所有 JPEG 图像 有些东西看起来像 Get ChildItem Path C Filter jpg Recursive where object Dimension eq 10
  • 同一视图中的普通模型和 IEnumerable 模型

    有一个小问题 我自己解决不了 我想在一个视图中使用相同的模型 但一次使用 IEnumerable 第二次不使用它 My View model IEnumerable
  • Apple Interface Builder:向 UIImageView 添加子视图

    我创建UIImageView在 Interface Bulder 的帮助下 现在我想在其中放置标签 作为其子视图 在代码中我可以输入如下内容 myUIImageView addSubview myUILabel 但我可以在IB的帮助下做到这
  • Java什么时候调用垃圾收集器

    我读了很多关于 Java 堆的文章 我看到如果我们得到 java lang OutOfMemoryError 我们应该增加 Xmx 来解决这个问题 for e g java Xmx2048m Xms256m 这会将 Java 使用的堆内存增
  • 在 Windows 上安装 PG Gem 时出错

    我使用 XAMPP 作为 PostgreSQL 9 3 的安装文件夹 C xampp pgsql 9 3 现在我尝试使用该目录作为参考来安装 PostgreSQL gem gem install pg with pg include C x
  • R 中的“抖动”函数有什么作用?

    根据文档 http astrostatistics psu edu su07 R html base html jitter html 的解释为jitter函数是 向数字向量添加少量噪声 这是什么意思 是否有一个随机数与向量中的每个数字相关
  • 使用 Tkinter 中的按钮终止线程

    在我的 GUI 代码中 我尝试通过单击一个按钮来同时运行循环 1 和循环 2 因此 我用了Thread为了达成这个 但我也尝试通过单击另一个按钮来阻止它 但失败了 在stackoverflow上搜索后发现没有直接杀死的方法Thread 这是
  • Rails 4:f.select 返回字符串而不是整数

    我有用户注册表格 用户必须通过选择选项选择他的国家 地区 当我提交表单时 我收到错误 Country 70309119520500 Expected got String 8039220 请帮助我如何将字符串转换为整数 以便我可以在数据库中
  • OpenGL ES 中使用的 3d 立方体的法线是什么?

    我有一个立方体定义为 float vertices Vertices according to faces 1 0f 1 0f 1 0f Vertex 0 1 0f 1 0f 1 0f v1 1 0f 1 0f 1 0f v2 1 0f 1
  • Visual Studio 2010 中的编程数据断点

    我一直在尝试使用编程数据断点 就像CBreakpoint http www morearty com code breakpoint 例如 通过使用SetThreadContext http msdn microsoft com en us
  • 使用 selenium2library 和 Robot Framework 验证页面中是否存在 2 个文本中的一个文本

    我想测试页面是否包含 TEXT1 或 TEXT2 页面应包含 TEXT1 或 TEXT2 有什么建议我该怎么做 目前我只能检查一篇文本 您可以使用 Page Should Contain Element http rtomac github
  • 列向量与行意味着——与 std::accumulate?

    为了尽可能地懒惰 我在矩阵中读为 vector lt vector
  • 除了动态参数和可选参数之外,C# 4.0 还有哪些新功能?

    所以 C 4 0 昨天出来了 它引入了备受争议的dynamic关键字 命名参数和可选参数 较小的改进是隐含的ref识别 COM 方法上的索引属性和默认属性 逆变和协变 实际上是 NET CLR 功能 不仅仅是 C 以及 真的是这样吗 是dy
  • 找出 Uneaten Leaves 算法错误

    我在面试挑战中遇到了这个问题 K 条毛毛虫正在吃掉 N 片叶子 每条毛毛虫 以独特的顺序从一片叶子落到另一片叶子 所有毛毛虫都开始 在位置 0 处的树枝上 并落在位置之间的叶子上 1 和 N 每条毛毛虫 j 都有一个关联的跳跃数 Aj A
  • 由于延迟加载而使用 Pony ORM 的 DatabaseSessionIsOver?

    我正在使用 Pony ORM 作为烧瓶解决方案 并且遇到了以下问题 考虑以下 db session def get orders of the week self user date q select o for o in Order fo
  • 同步块和监视器对象

    您好 有人可以解释一下下面的代码中的同步代码是否会限制对线程的访问 如果是的话 它与我们使用 this 而不是 msg 作为监视对象有什么不同 public void display String msg synchronized msg
  • 使用 C 中的 GLib/GIO 从 Web 获取文件

    我应该使用什么函数使用 GLib GIO 库从网络获取文件 如果我的文件来自 gchar path http xxx yyyServer sharing temp txt 我应该怎么做才能下载它 对于本地文件 我只使用 fopen 和 fr