简介
GKeyFile是一个key-value文件解析器,可以解析key-value文件,也可以对文件进行修改。key-value文件和ini文件非常相似,但又有不同(不同点见本章专题),freedesktop.org的很多标准都采用了key-value文件,如Desktop Entry Specification
标准及Icon Theme Specification
。
数据结构
GKeyFile是一个不透明的结构体。
typedef struct _GKeyFile GKeyFile;
函数列表
GKeyFile * g_key_file_new ()
void g_key_file_free ()
GKeyFile * g_key_file_ref ()
void g_key_file_unref ()
void g_key_file_set_list_separator ()
gboolean g_key_file_load_from_file ()
gboolean g_key_file_load_from_data ()
gboolean g_key_file_load_from_bytes ()
gboolean g_key_file_load_from_data_dirs ()
gboolean g_key_file_load_from_dirs ()
gchar * g_key_file_to_data ()
gboolean g_key_file_save_to_file ()
gchar * g_key_file_get_start_group ()
gchar ** g_key_file_get_groups ()
gchar ** g_key_file_get_keys ()
gboolean g_key_file_has_group ()
gboolean g_key_file_has_key ()
gchar * g_key_file_get_value ()
gchar * g_key_file_get_string ()
gchar * g_key_file_get_locale_string ()
gchar * g_key_file_get_locale_for_key ()
gboolean g_key_file_get_boolean ()
gint g_key_file_get_integer ()
gint64 g_key_file_get_int64 ()
guint64 g_key_file_get_uint64 ()
gdouble g_key_file_get_double ()
gchar ** g_key_file_get_string_list ()
gchar ** g_key_file_get_locale_string_list ()
gboolean * g_key_file_get_boolean_list ()
gint * g_key_file_get_integer_list ()
gdouble * g_key_file_get_double_list ()
gchar * g_key_file_get_comment ()
void g_key_file_set_value ()
void g_key_file_set_string ()
void g_key_file_set_locale_string ()
void g_key_file_set_boolean ()
void g_key_file_set_integer ()
void g_key_file_set_int64 ()
void g_key_file_set_uint64 ()
void g_key_file_set_double ()
void g_key_file_set_string_list ()
void g_key_file_set_locale_string_list ()
void g_key_file_set_boolean_list ()
void g_key_file_set_integer_list ()
void g_key_file_set_double_list ()
gboolean g_key_file_set_comment ()
gboolean g_key_file_remove_group ()
gboolean g_key_file_remove_key ()
gboolean g_key_file_remove_comment ()
函数功能分类
// 创建GKeyFile对象
GKeyFile * g_key_file_new ()
// 释放GKeyFile对象
void g_key_file_free ()
// 引用解引用
GKeyFile * g_key_file_ref ()
void g_key_file_unref ()
// 设置值分隔符,默认分隔符为分号
void g_key_file_set_list_separator ()
// 加载数据
// 从文件加载
gboolean g_key_file_load_from_file ()
// 从内存加载
gboolean g_key_file_load_from_data ()
// 从GBytes加载
gboolean g_key_file_load_from_bytes ()
// 从默认用户目录或系统目录查找文件并加载
gboolean g_key_file_load_from_data_dirs ()
// 从指定目录搜索文件文件并加载
gboolean g_key_file_load_from_dirs ()
// key_file转换成字符串
gchar * g_key_file_to_data ()
// 保存
// 将key_file保存到文件
gboolean g_key_file_save_to_file ()
// 查找
// 是否有指定的组
gboolean g_key_file_has_group ()
// 是否有指定的key
gboolean g_key_file_has_key ()
// 获取get
// 获取第一个组的组名
gchar * g_key_file_get_start_group ()
// 获取所有的组
gchar ** g_key_file_get_groups ()
// 获取一个组下的所有键
gchar ** g_key_file_get_keys ()
// 获取key的原始格式值
gchar * g_key_file_get_value ()
gchar * g_key_file_get_string ()
// 获取本地化字符串
gchar * g_key_file_get_locale_string ()
// 获取键的本地化值
gchar * g_key_file_get_locale_for_key ()
// 根据键获取不同类型的值
gboolean g_key_file_get_boolean ()
gint g_key_file_get_integer ()
gint64 g_key_file_get_int64 ()
guint64 g_key_file_get_uint64 ()
gdouble g_key_file_get_double ()
// 根据键获取不同类型的多个值
gchar ** g_key_file_get_string_list ()
gchar ** g_key_file_get_locale_string_list ()
gboolean * g_key_file_get_boolean_list ()
gint * g_key_file_get_integer_list ()
gdouble * g_key_file_get_double_list ()
// 获取注释
gchar * g_key_file_get_comment ()
// 设置set
// 设置值
void g_key_file_set_value ()
// 设置字符串
void g_key_file_set_string ()
// 设置本地化字符串
void g_key_file_set_locale_string ()
// 设置不同格式的值
void g_key_file_set_boolean ()
void g_key_file_set_integer ()
void g_key_file_set_int64 ()
void g_key_file_set_uint64 ()
void g_key_file_set_double ()
// 设置不同格式的一组值
void g_key_file_set_string_list ()
void g_key_file_set_locale_string_list ()
void g_key_file_set_boolean_list ()
void g_key_file_set_integer_list ()
void g_key_file_set_double_list ()
// 设置注释
gboolean g_key_file_set_comment ()
// 删除
// 删除一个组
gboolean g_key_file_remove_group ()
// 删除一个键
gboolean g_key_file_remove_key ()
// 删除注释
gboolean g_key_file_remove_comment ()
函数功能说明及综合演示
键值获取
本程序演示从key-value文件读取内容,根据指定的值获取对应的字符串,获取所有组名,获取key的所有整型值。
g_key_file_get_value
和g_key_file_get_string
的区别:
- get_value获取的是原始字符串
- get_string获取的是转义后的字符串
一个key可以有多个值,一般默认是分号分隔,也可以使用
g_key_file_set_list_separator
修改成其他字符。
key-value文件内容:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
# localized strings are stored in multiple key-value pairs
Welcome=Hello
Welcome[de]=Hallo
Welcome[fr_FR]=Bonjour
Welcome[it]=Ciao
Welcome[be@latin]=Hello
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_get
#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_get.ini"
gint main(gint argc, gchar *argv)
{
gboolean ret = FALSE;
GKeyFile *key_file = NULL;
gchar *first_group_name_val = NULL;
gint i = 0;
gchar **group_names;
gsize len = 0;
gint *int_val = NULL;
key_file = g_key_file_new ();
if(NULL == key_file) {
g_print("key file new failed! \n");
}
ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
if(FALSE == ret) {
g_print("key file load failed \n");
return -1;
}
/* get value */
g_print("******************** \n");
g_print("get value \n");
first_group_name_val = g_key_file_get_value(key_file, "First Group", "Name", NULL);
if(NULL == first_group_name_val) {
return -1;
}
g_print("(get value)first_group_name_val is %s \n", first_group_name_val);
g_free(first_group_name_val);
/* get string */
g_print("******************** \n");
g_print("get string \n");
first_group_name_val = g_key_file_get_string(key_file, "First Group", "Name", NULL);
if(NULL == first_group_name_val) {
return -1;
}
g_print("(get string)first_group_name_val is %s \n", first_group_name_val);
g_free(first_group_name_val);
/* get groups */
g_print("******************** \n");
g_print("get groups \n");
group_names = g_key_file_get_groups(key_file, &len);
while(NULL != group_names[i]) {
g_print("group_name[%d] is: %s \n", i++, group_names[i]);
}
g_strfreev(group_names);
/* get interger list */
g_print("******************** \n");
g_print("get interger list \n");
len = 0;
i = 0;
int_val = g_key_file_get_integer_list(key_file, "Another Group", "Numbers", &len, NULL);
for(i=0;i<len;i++) {
g_print("int_val[%d]:%d \n", i, int_val[i]);
}
g_free(int_val);
g_key_file_free(key_file);
return 0;
}
运行结果:
[root@centos7_6 glib_keyfile_get]# ./glib_keyfile_get
********************
get value
(get value)first_group_name_val is Key File Example\tthis value shows\nescaping
********************
get string
(get string)first_group_name_val is Key File Example this value shows
escaping
********************
get groups
group_name[0] is: First Group
group_name[1] is: Another Group
********************
get interger list
int_val[0]:2
int_val[1]:20
int_val[2]:-200
int_val[3]:0
键值设置
本程序演示设置键值并保存到文件。用到的函数为g_key_file_set_xxx
和g_key_file_save_to_file
。
key-value文件内容:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_set_save
#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_set_save.ini"
gint main(gint argc, gchar *argv)
{
gboolean ret = FALSE;
GKeyFile *key_file = NULL;
gchar *contents = NULL;
gsize length = 0;
gboolean bools[2] = { TRUE, FALSE };
g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
g_print("before set:\n%s\n", contents);
g_free(contents);
key_file = g_key_file_new ();
if(NULL == key_file) {
g_print("key file new failed! \n");
}
ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
if(FALSE == ret) {
g_print("key file load failed \n");
return -1;
}
/* set value */
g_print("******************** \n");
g_print("set value \n");
g_key_file_set_value(key_file, "Another Group", "New Item", "abcdefg");
/* set group */
g_print("******************** \n");
g_print("set group and bool list \n");
g_key_file_set_boolean_list(key_file, "New Group", "Bools", bools, 2);
g_key_file_save_to_file(key_file, TEST_KEY_FILE_BASIC_FILE, NULL);
g_key_file_free(key_file);
g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
g_print("after set:\n%s\n", contents);
g_free(contents);
return 0;
}
运行结果:
[root@centos7_6 glib_keyfile_set_save]# ./glib_keyfile_set_save
before set:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
********************
set value
********************
set group and bool list
after set:
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
New Item=abcdefg
[New Group]
Bools=true;false;
键删除
本程序演示删除键和删除整组。用到的函数为g_key_file_remove_key
和g_key_file_remove_group
。
key-value文件内容:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
[Third Group]
AAA=100
BBB=true;false;true;true
[Fourth Group]
DeleteMe=abcdefg
DeleteThem=100;200;300;400
演示程序:
源码见glib_examples\glib_keyfile\glib_keyfile_remove
#include <glib.h>
#define TEST_KEY_FILE_BASIC_FILE "./keyfile_remove.ini"
gint main(gint argc, gchar *argv)
{
gboolean ret = FALSE;
GKeyFile *key_file = NULL;
gchar *contents = NULL;
gsize length = 0;
gboolean bools[2] = { TRUE, FALSE };
g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
g_print("before set:\n%s\n", contents);
g_free(contents);
key_file = g_key_file_new ();
if(NULL == key_file) {
g_print("key file new failed! \n");
}
ret = g_key_file_load_from_file(key_file, TEST_KEY_FILE_BASIC_FILE, 0, NULL);
if(FALSE == ret) {
g_print("key file load failed \n");
return -1;
}
/* set value */
g_print("******************** \n");
g_print("set value \n");
g_key_file_set_value(key_file, "Another Group", "New Item", "abcdefg");
/* set group */
g_print("******************** \n");
g_print("set group and bool list \n");
g_key_file_set_boolean_list(key_file, "New Group", "Bools", bools, 2);
/* remove key */
g_print("******************** \n");
g_print("remove key \n");
ret = g_key_file_remove_key(key_file, "Third Group", "AAA", NULL);
g_print("remove key %s \n", ret?"Success":"Failed");
/* remove group */
g_print("******************** \n");
g_print("remove group \n");
ret = g_key_file_remove_group(key_file, "Fourth Group", NULL);
g_print("remove group %s \n", ret?"Success":"Failed");
g_key_file_save_to_file(key_file, TEST_KEY_FILE_BASIC_FILE, NULL);
g_key_file_free(key_file);
g_file_get_contents(TEST_KEY_FILE_BASIC_FILE, &contents, &length, NULL);
g_print("after set and remove:\n%s\n", contents);
g_free(contents);
return 0;
}
运行结果:
[root@centos7_6 glib_keyfile_remove]# ./glib_keyfile_remove
before set:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
[Third Group]
AAA=100
BBB=true;false;true;true
[Fourth Group]
DeleteMe=abcdefg
DeleteThem=100;200;300;400
********************
set value
********************
set group and bool list
********************
remove key
remove key Success
********************
remove group
remove group Success
after set and remove:
[First Group]
Name=Key File Example\tthis value shows\nescaping
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
New Item=abcdefg
[Third Group]
BBB=true;false;true;true
[New Group]
Bools=true;false;
专题
key-value文件和ini文件的区别
- ini文件使用’;‘字符作为注释行的开始,而key-value文件使用’#'字符作为注释行的开始
- key-value文件不允许未分组的键值
- key-value文件的编码方式是UTF-8
- key-value文件的组名和键名区分大小写,如[GROUP]和[group]是两个不同的组
- ini文件没有强类型的bool条目类型,只有GetProfileInt()。key-value文件中,布尔类型只能是小写的true或false
一个key-value文件的官方例子如下:
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping
# localized strings are stored in multiple key-value pairs
Welcome=Hello
Welcome[de]=Hallo
Welcome[fr_FR]=Bonjour
Welcome[it]=Ciao
Welcome[be@latin]=Hello
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true