struct GResource {/* No available fields */
}

应用程序applications和库libraries通常包含二进制或文本数据,这些数据实际上是应用程序的一部分,而不是用户数据。例如GtkBuilder .ui文件,splashscreen图像,GMenu标记XML, CSS文件,图标等。它们通常以文件的形式存储在$datadir/appname中,或者以字符串字面量的形式手动包含在代码中。

GResource API[glib-compile-resources]。[glib-compile-resources]程序提供了一个方便高效的替代方案,它有一些很好的属性。你可以像普通文件一样维护这些文件,所以很容易编辑它们,但是在构建过程中,这些文件会被组合成一个链接到可执行文件中的二进制包。这意味着加载资源文件是高效的(因为它们已经在内存中,与其他实例共享)和简单的(不需要检查I/O错误或在文件系统中定位文件)。它还使创建可重定位的应用程序变得更容易。

资源文件也可以标记为压缩文件compressed。这些文件将以压缩形式包含在资源包中,但在使用资源时将自动解除压缩。这非常有用,例如,对于只解析一次(或很少解析)然后丢弃的大型文本文件(调用次数少)。

通过将preprocess属性的值设置为逗号分隔的预处理选项列表,也可以将资源文件标记为可预处理。目前唯一支持的选项是:

xml-stripblanks它将使用xmllint命令从XML文件中去除可忽略的空白。为此,必须将XMLLINT环境变量设置为XMLLINT可执行文件的完整路径,或者必须将XMLLINT包含在该路径中;否则跳过预处理步骤。

to-pixdata(自gdk-pixbuf 2.32起已弃用),它将使用gdk-pixbuf-pixdata命令将图像转换为GdkPixdata格式,这允许您直接使用资源文件中的数据创建pixbufs,而不是它的(未压缩)副本。为此,路径中必须有gdk-pixbuf-pixdata程序,或者必须将GDK_PIXBUF_PIXDATA环境变量设置为gdk-pixbuf-pixdata可执行文件的完整路径;否则资源编译器将中止。自从gdk-pixbuf 2.32以来,to-pixdata已经被弃用,因为GResource同样支持嵌入现代图像格式。与其直接使用它**,不如在GResource中嵌入PNG或SVG文件**。

json-stripblanks将使用json-glib-format命令从JSON文件中删除可忽略的空格。要做到这一点,必须将环境变量JSON_GLIB_FORMAT设置为json-glib-format可执行文件的完整路径,或者它必须在该路径中;否则跳过预处理步骤。此外,至少需要1.6版本的json-glib格式。

使用给定的前缀和file元素中的文件名的组合,资源文件将在GResource命名空间中导出。alias属性可用于更改文件名,以便在资源命名空间中的不同位置公开它们。通常,这用于包含来自不同源目录的文件,而不会暴露资源命名空间中的源目录,如下面的示例所示。

资源包是由[glib-compile-resources].[glib-compile-resources]程序创建的,该程序接受一个描述资源包的XML文件和XML引用的一组文件。这些组合成二进制资源包。

资源描述示例:注意前缀开始时候有斜杠,结尾没有。调用资源的时候/org/gtk/Example/file_name

<?xml version="1.0" encoding="UTF-8"?>
<gresources><gresource prefix="/org/gtk/Example"><file>data/splashscreen.png</file><file compressed="true">dialog.ui</file><file preprocess="xml-stripblanks">menumarkup.xml</file><file alias="example.css">data/example.css</file></gresource>
</gresources>

这将创建一个包含以下文件的资源包:

/org/gtk/Example/data/splashscreen.png
/org/gtk/Example/dialog.ui
/org/gtk/Example/menumarkup.xml
/org/gtk/Example/example.css

请注意,进程中的所有资源都共享相同的命名空间,因此请使用java风格的路径前缀(如上例所示)来避免冲突。

然后,您可以使用[glib-compile-resources][glib-compile-resources]将XML编译为可以用g_resource_load()加载的二进制包。然而,更常见的是使用-generate-source和-generate-header参数来创建直接链接到应用程序的源文件和头文件。这将生成get_resource()、register_resource()和unregister_resource()函数,以传递给[glib-compile-resources]``[glib-compile-resources]的–c-name参数作为前缀。get_resource()返回生成的GResource对象register和unregister函数注册资源,以便可以使用g_resources_lookup_data()访问其文件。

一旦创建并注册了GResource,就可以在进程中使用API调用(如g_resources_open_stream())来访问数据流或g_resources_lookup_data()来获得数据的直接指针,从而全局访问其中的所有数据。你也可以使用类似于" resource:///org/gtk/Example/data/splashscreen.png "的uri来访问GFile中的资源数据。

一些高级api,如GtkApplication,将自动从资源命名空间中的某些知名路径加载资源,以方便使用。有关这些api的详细信息,请参阅文档。

生成的源代码有两种形式,默认版本使用编译器对构造函数和析构函数的支持(如果可用),在启动或库加载时自动创建和注册GResource。如果传递--manual-register参数,则会创建两个用于注册/注销资源的函数。这需要在应用程序/库中显式地调用初始化,但它在所有平台上都可以工作,即使是在不支持构造函数的次要平台上。(至少Win32、Mac OS和Linux支持构造函数。)

请注意,资源数据可以直接指向数据段(例如library),所以如果你在运行时卸载库,你需要非常小心地保存来自资源的数据指针,因为当库卸载时,这将消失。然而,在实践中这通常不是问题,因为大多数资源访问都是为了您自己的资源,而且资源数据通常只在解析期间使用一次,然后发布。

在调试程序或测试对已安装版本的更改时,能够在不重新编译的情况下替换程序或库中的资源,以达到调试或快速破解和测试的目的,通常很有用。从GLib 2.50开始,就可以使用G_RESOURCE_OVERLAYS环境变量有选择地覆盖文件系统中的资源。它是一个由g_searchpath_separator分隔的替换列表,在资源查找期间执行。在setuid进程中运行时,它会被忽略。

代换有这样的形式

/org/gtk/libgtk=/home/desrt/gtk-overlay

=之前的部分是覆盖应用的资源子路径。后面的部分是一个文件系统路径,其中包含了你希望作为资源加载的文件和子目录,具有相同的名称。

在上面的例子中,如果应用程序试图加载资源路径为/org/gtk/libgtk/ui/gtkdialog的资源。然后GResource会检查文件系统路径/home/desrt/gtk-overlay/ui/gtkdialog.ui。如果在那里找到了文件,就会使用它。这是一个覆盖层,而不是完全的替换,这意味着如果在该路径下没有找到文件,则将使用内置版本。目前不支持whiteouts。

替换必须以斜杠开始,并且不能在=之前包含一个斜杠。理想情况下,斜杠后面的路径应该是绝对的,但这不是严格要求的。可以用单个文件覆盖单个资源的位置。

可用版本:2.32

参考:Gio Resource

十一、Gio Resource相关推荐

  1. [转]Windows Shell 编程 第十一章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987992】...

    第十一章 探索Shell 我们现在将注意力从API转向Windows Shell本身.从这一章往后,我们的目标主要集中在清晰和全面的揭示探测器的工作原理和Shell 命名空间的构成对象上,最后给出客户 ...

  2. WSAEWOULDBLOCK: Resource temporarily unavailable

    SAP手记三:安装过程的三个小错误 1.安装sap.oracle提示swap space不够问题 将你电脑的虚拟内存修改到足够大就可以了: 2.ECC6.0 到IMPORT ABAP出错 不管三七二十 ...

  3. AnalyticDB MySQL拥抱云原生,强力支撑双十一

    简介:阿里云在2020年11月,成功入选Gartner全球数据库领导者象限,云原生数据仓库AnalyticDB是阿里云数据库产品矩阵中重要的一环.今年双十一阿里实现了4982亿元的成交额,每年双十一购 ...

  4. 秘密武器 | 看AnalyticDB如何强力支撑双十一

    简介:第12个双11已圆满结束,但对技术的探索永不止步.每年双11,不仅仅是剁手族的狂欢节,更是数据人的"大考",是检验阿里云数据库技术团队技术水平与技术创新实践的舞台.本站已陆续 ...

  5. 【深入浅出MyBatis系列十一】缓存源码分析

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 深入浅出MyBatis系列 [深入浅出MyBatis系列一]MyBatis入门 [深入浅出MyBatis系列二]配置 ...

  6. docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  7. SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)

    微信公众号:吉姆餐厅ak 学习更多源码知识,欢迎关注. SpringBoot2 | SpringBoot启动流程源码分析(一) SpringBoot2 | SpringBoot启动流程源码分析(二) ...

  8. 201771010101 白玛次仁《面向对象程序设计(Java)》第十一周学习总结

    实验十一   集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: (2) 了解java集合框架体系组成: (3)  ...

  9. 我的MYSQL学习心得(十一) 视图

    我的MYSQL学习心得(十一) 视图 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

最新文章

  1. 云游戏、VR、AI,云计算给元宇宙提供了哪些想象力?
  2. python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数
  3. 技术是最求 买卖是境界
  4. 1.6.2java工业星系_我的世界1.6.4
  5. 使用网盘搭建svn服务器详解步骤
  6. ----uni-app之用canvas同时画多张海报实现分享----
  7. zookeeper配置
  8. 数据结构与算法--利用栈实现队列
  9. windows server 2008 IE代理服务器实验
  10. nginx 带宽_Nginx的Gzip功能
  11. 【kafka】kafka kerberos KeeperErrorCode = InvalidACL for /config/topics
  12. 目标检测——域适应的学习笔记
  13. 简单查询树形结构数据库表
  14. vue 日程表组件_VUE也有自己的日历组件
  15. “Improving Adversarial Robustness Requires Revisiting Misclassified Examples“ 论文笔记
  16. 解决com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.
  17. 肿瘤免疫疗法 | 细胞治疗和PD1/PDL1 | Tumor immunotherapy | cell therapy
  18. 【进阶篇】前端学习路线
  19. Linux操作命令分类详解 - 用户权限(三)
  20. cuda的安装,及pytorch调用GPU步骤

热门文章

  1. 【零样本学习】Feature Generating Networks for Zero-Shot Learning
  2. 如何准备大厂技术面试?偷学「大师兄」秘籍!
  3. 企业级数据中台的建设方法、架构和技术栈
  4. form表单之input标签
  5. Websocket-sharp重连机制解决方案
  6. 基于java的springboot失物招领系统毕业设计springboot开题报告
  7. 程序员刚写完代码 , 就被开除了,网友笑到抽筋
  8. 蓝桥杯每日一练:芯片检测
  9. 大一 PTA L1-6 猜数字游戏
  10. Oracle 内存结构