SuperCat's Home

今日も頑張ろね~

使用GLib 2.32中的GResource

| Comments

在GLib 2.32中,添加了GResource这个模块,它提供了跨平台的程序资源(相信学过Win32编程的都知道这个是啥)集成支持,它可以将程序内所有非代码数据打包进一个文件,或者是可执行文件的段内,这样方便了程序的分发,也解决了访问路径的问题。既然它有如此强大的功能,那么该如何使用它呢?下面举一个简单的例子来说明。

首先准备好一个文本文件(如test.txt,内容随意),然后需要编写一个XML文件:

GResource XML资源文件示例
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/org/test/HelloWorld">
    <file compressed="true">test.txt</file>
  </gresource>
</gresources>

将这个XML命名为test.gresource.xml,并且与test.txt在同一个目录下,在Shell中进入文件所在目录后,使用以下命令:

1
2
glib-compile-resources --target=test-resources.c --generate-source test.gresource.xml
glib-compile-resources --target=test-resources.h --generate-header test.gresource.xml

完成以后,会得到2个文件: test-resources.c和test-resources.h。有了这些文件,就可以在程序中使用资源了,下面是一个测试程序,该程序将显示资源内test.txt的内容:

GResource访问测试示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <glib.h>
#include <stdio.h>
#include <glib-object.h>
#include <gio/gio.h>

int main(int argc, char *argv[])
{
    gchar *data = NULL;
    gsize length;
    GFile *file;
    g_type_init();
    file = g_file_new_for_uri("resource:///org/test/HelloWorld/test.txt");
    if(!g_file_load_contents(file, NULL, &data, &length, NULL, NULL))
    {
        fprintf(stderr, "Cannot open resource data!\n");
        g_object_unref(file);
        return 1;
    }
    g_object_unref(file);
    printf("Data: %s\n", data);
    g_free(data);
    return 0;
}

将上面的代码保存为test.c,使用下面的命令来编译它:

1
gcc `pkg-config --cflags --libs glib-2.0 gio-2.0` -o test test.c test-resources.c

运行test (./test),即可打印出资源test.txt的内容。即使原来的test.txt被删除了,只要程序本身完整,就能够读取出资源内容。

本文简单介绍了GLib 2.32中新添加的GResouce的使用方法,详细的情况请参考GLib的文档: GIO Reference Manual。希望本文能给更多使用GLib进行程序开发的人一些帮助。

Comments