glib帮助文档:https://developer.gnome.org/glib/
本节主要讲解Key-value文件解析器,可以轻松的帮我们实现配置文件的解析,类似于.ini文件的解析。
Includes
#include
#include
描述
GKeyFile允许您解析,编辑或创建包含键值对的文件,我们称之为“key files”,因为缺少更好的名称。 一些freedesktop.org规范现在使用key files,例如Desktop Entry Specification和Icon Theme Specification。
key files的语法在Desktop Entry Specification中有详细描述,这里是一个快速总结:key files由多组键值对组成,其中散布着注释。
# 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
以'#'开头的行和空行被视为注释。
g_autoptr(GError) error = NULL;
g_autoptr(GKeyFile) key_file = g_key_file_new ();
if (!g_key_file_load_from_file (key_file, "key-file.ini", flags, &error))
{
if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error loading key file: %s", error->message);
return;
}
g_autofree gchar *val = g_key_file_get_string (key_file, "Group Name", "SomeKey", &error);
if (val == NULL &&
!g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND))
{
g_warning ("Error finding key in key file: %s", error->message);
return;
}
else if (val == NULL)
{
// Fall back to a default value.
val = g_strdup ("default-value");
}
以下是创建和保存key files的示例:
g_autoptr(GKeyFile) key_file = g_key_file_new ();
const gchar *val = …;
g_autoptr(GError) error = NULL;
g_key_file_set_string (key_file, "Group Name", "SomeKey", val);
// Save as a file.
if (!g_key_file_save_to_file (key_file, "key-file.ini", &error))
{
g_warning ("Error saving key file: %s", error->message);
return;
}
// Or store to a GBytes for use elsewhere.
gsize data_len;
g_autofree guint8 *data = (guint8 *) g_key_file_to_data (key_file, &data_len, &error);
if (data == NULL)
{
g_warning ("Error saving key file: %s", error->message);
return;
}
g_autoptr(GBytes) bytes = g_bytes_new_take (g_steal_pointer (&data), data_len);
功能
GKeyFile * g_key_file_new ()
创建一个新的空的GKeyFile对象。 使用g_key_file_load_from_file(),g_key_file_load_from_data(),g_key_file_load_from_dirs()或g_key_file_load_from_data_dirs()读取现有key files。
返回
一个空的GKeyFile。 [代码完成后的需要释放数据]
由于:2.6
void g_key_file_free ()
清除key_file中的所有keys和组,并将引用计数减1。如果引用计数达到零,则释放key files及其分配的所有内存。[以C代码暴露,不一定在其他语言中可用]
参数
key_file
一个GKeyFile
由于:2.6
GKeyFile * g_key_file_ref ()
增加key_file的引用计数。[以C代码暴露,不一定在其他语言中可用]
参数
key_file
一个GKeyFile
返回
相同的key_file。
从:2.32
void g_key_file_unref ()
将key_file的引用计数减1。如果引用计数达到零,则释放key files及其分配的所有内存。
参数
key_file
一个GKeyFile
从:2.32
void g_key_file_set_list_separator ()
设置用于分隔列表中的value的字符。 通常';' 或','被用作分隔符。 默认列表分隔符是';'。
参数
key_file
一个GKeyFile
separator
分离器
由于:2.6
gboolean g_key_file_load_from_file ()
将key files加载到空的GKeyFile结构中。
如果操作系统在打开或读取文件时返回错误,则返回G_FILE_ERROR。 如果解析文件时出现问题,则返回G_KEY_FILE_ERROR。
该函数永远不会返回G_KEY_FILE_ERROR_NOT_FOUND错误。 如果找不到该文件,则返回G_FILE_ERROR_NOENT。
参数
key_file
一个空的GKeyFile结构
file
在GLib文件名编码中加载的文件名的路径。[用给定类型覆盖解析的filename类型]
flags
来自GKeyFileFlags的标志
error
返回GError的位置,或NULL
返回
如果可以加载密钥文件则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_load_from_data ()
将内存中的key files加载到空的GKeyFile结构中。 如果对象不能被创建,那么错误被设置为GKeyFileError。
参数
key_file
一个空的GKeyFile结构
data
内存中的key files
length
以字节为单位的数据长度(或(gsize)-1,如果数据以'/0'结尾)
flags
来自GKeyFileFlags的标志
error
返回GError的位置,或NULL
返回
如果可以加载key files则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_load_from_bytes ()
将data中的key files以字节为单位加载到空的GKeyFile结构中。 如果对象不能被创建,那么错误被设置为GKeyFileError。
参数
key_file
一个空的GKeyFile结构
bytes
一个GBytes
flags
来自GKeyFileFlags的标志
error
返回GError的位置,或NULL
返回
如果可以加载key files则为TRUE,否则为FALSE
自:2.50
gboolean g_key_file_load_from_data_dirs ()
该函数在从g_get_user_data_dir()和g_get_system_data_dirs()返回的路径中查找名为file的key files,将文件加载到key_file中,并在full_path中返回该文件的完整路径。 如果文件无法加载,则会将错误设置为GFileError或GKeyFileError。
参数
key_file
一个空的GKeyFile结构
file
一个打开和解析文件名的相对路径。[用给定类型覆盖解析的filename类型]
full_path
返回包含文件完整路径的字符串的位置,或NULL。[参数是返回的结果] [用给定类型覆盖解析的filename类型] [可以传递NULL]
flags
来自GKeyFileFlags的标志
error
返回GError的位置,或NULL
返回
如果可以加载key files则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_load_from_dirs ()
该函数在search_dirs指定的路径中查找名为file的key files,将文件加载到key_file中,并在full_path中返回文件的完整路径。
如果在任何search_dirs中找不到该文件,则返回G_KEY_FILE_ERROR_NOT_FOUND。 如果找到文件但操作系统在打开或读取文件时返回错误,则返回G_FILE_ERROR。 如果解析文件时出现问题,则返回G_KEY_FILE_ERROR。
参数
key_file
一个空的GKeyFile结构
file
一个打开和解析文件名的相对路径。[用给定类型覆盖解析的filename类型]
search_dirs
以NULL结尾的目录数组进行搜索。[参数指向数组的某一项,终止符为1] [容器和数组的定义元素为filename]
full_path
返回包含文件完整路径的字符串的位置,或NULL。[参数是返回的结果] [用给定类型覆盖解析的filename类型] [可以传递NULL]
flags
来自GKeyFileFlags的标志
error
返回GError的位置,或NULL
返回
如果可以加载密钥文件则为TRUE,否则为FALSE
从:2.14
gchar * g_key_file_to_data ()
该函数将key_file作为字符串输出。
请注意,此函数从不报告错误,所以将NULL赋值给error是安全的。
参数
key_file
一个GKeyFile
length
返回返回的字符串长度的位置,或NULL。[参数是返回的结果][可以传递NULL]
error
返回GError的位置,或NULL
返回
一个新分配的字符串,其中包含GKeyFile的内容
由于:2.6
gboolean g_key_file_save_to_file ()
使用g_file_set_contents()将key_file的内容写入文件名。
由于g_file_set_contents()可能失败,此函数可能会失败。
参数
key_file
一个GKeyFile
filename
要写入的文件的名称
error
指向NULL GError的指针或NULL
返回
如果成功则为TRUE,否则返回FALSE并设置错误
从:2.40
gchar * g_key_file_get_start_group ()
返回文件起始组的名称。
参数
key_file
一个GKeyFile
返回
key file的起始组。
由于:2.6
gchar ** g_key_file_get_groups ()
返回用key_file加载的key file中的所有组。 返回的组数组将以NULL结尾,所以长度可以选择为NULL。
参数
key_file
一个GKeyFile
length
返回返回组的数量的位置,或NULL。[参数是返回的结果][可以传递NULL]
返回
一个新分配的以NULL结尾的字符串数组。 使用g_strfreev()释放它。[参数指向数组的某一项,终止符为1] [代码完成后的需要释放数据]
由于:2.6
gchar ** g_key_file_get_keys ()
返回组名group_name的所有keys。 返回的key的数组将以NULL结尾,所以长度可以选择为NULL。 如果找不到group_name,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_GROUP_NOT_FOUND。
参数
key_file
一个GKeyFile
group_name
一个组名
length
返回返回位置的数量,或NULL。[参数是返回的结果][可以传递NULL]
error
返回GError的位置,或NULL
返回
一个新分配的以NULL结尾的字符串数组。 使用g_strfreev()释放它。[参数指向数组的某一项,终止符为1] [代码完成后的需要释放数据]
由于:2.6
gboolean g_key_file_has_group ()
查看key file是否具有组group_name。
参数
key_file
一个GKeyFile
group_name
一个组名
返回
如果group_name是key_file的一部分,则为TRUE,否则为FALSE。
由于:2.6
gboolean g_key_file_has_key ()
查看key file是否在组group_name中具有key。
请注意,此功能严格遵循GError的规则; 返回值都带有含义并表示错误。 要使用此函数,您必须传递一个错误的GError指针,并检查它是否不为NULL以查看是否发生错误。
语言绑定应该使用g_key_file_get_value()来测试key是否存在。[以C代码暴露,不一定在其他语言中可用]
参数
key_file
一个GKeyFile
group_name
一个组名
key
一个关键的名字
error
返回GError的位置
返回
如果key是group_name的一部分,则为TRUE,否则为FALSE
由于:2.6
gchar * g_key_file_get_value ()
返回与group_name下的key关联的原始值。 使用g_key_file_get_string()来检索未转义的UTF-8字符串。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 如果找不到group_name,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_GROUP_NOT_FOUND。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
error
返回GError的位置,或NULL
返回
一个新分配的字符串或NULL,如果找不到指定的键。
由于:2.6
gchar * g_key_file_get_string ()
返回与group_name下的key关联的字符串值。 与g_key_file_get_value()不同,此函数处理\s等转义序列。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 如果找不到group_name,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_GROUP_NOT_FOUND。
参数
KEY_FILE
一个GKeyFile
group_name
一个组名
key
关键
error
返回GError的位置,或NULL
返回
一个新分配的字符串或NULL,如果找不到指定的key。
由于:2.6
gchar * g_key_file_get_locale_string ()
如果可用,则返回在给定语言环境中翻译的group_name下与key关联的value。 如果locale设置为NULL,则假定当前区域设置。
如果locale设置为非NULL,或者当前语言环境将在GKeyFile的生命周期内更改,则必须使用G_KEY_FILE_KEEP_TRANSLATIONS加载,以便为所有语言环境加载字符串。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 如果与key关联的值无法解释或者找不到合适的翻译,则返回未转换的值。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
locale
一个区域标识符或NULL。[NULL可以作为输入,输出,输入输出; 或作为返回值]
错误
返回GError的位置,或NULL
返回
一个新分配的字符串或NULL,如果找不到指定的key。
由于:2.6
gboolean g_key_file_get_boolean ()
以boolean值的形式返回与group_name下的key关联的value。
如果找不到key,则返回FALSE,并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key关联的值不能被解释为布尔值,则返回FALSE并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
error
返回GError的位置
返回
与key关联的值作为布尔值;如果key未找到或无法解析,则返回FALSE。
由于:2.6
gint g_key_file_get_integer ()
以整数形式返回与group_name下的key关联的value。
如果找不到key,则返回0,并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key关联的值不能被解释为整数,或者超出gint的范围,则返回0,并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
error
返回GError的位置
返回
与key关联的value为整数,如果key未找到或无法解析,则返回0。
由于:2.6
gint64 g_key_file_get_int64 ()
返回与group_name下的key关联的value,作为有符号的64位整数。 这与g_key_file_get_integer()类似,但可以在不截断的情况下返回64位结果。
参数
key_file
一个非NULL的GKeyFile
group_name
一个非NULL组名
key
一个非NULL键
error
返回GError的位置
返回
与key相关的value作为有符号的64位整数,如果未找到或无法解析key,则返回0。
从:2.26
guint64 g_key_file_get_uint64 ()
返回与group_name下的key相关的value,作为无符号的64位整数。 这与g_key_file_get_integer()类似,但可以在不截断的情况下返回大的肯定结果。
参数
key_file
一个非NULL的GKeyFile
group_name
一个非NULL组名
key
一个非NULL键
error
返回GError的位置
返回
与该key相关联的value作为无符号的64位整数,如果该key未找到或无法解析,则返回0。
从:2.26
gdouble g_key_file_get_double ()
以double形式返回与group_name下的key关联的value。 如果group_name为NULL,则使用start_group。
如果找不到key,则返回0.0并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key关联的value不能被解释为double,则返回0.0,并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
error
返回GError的位置
返回
与该key相关联的value为double,如果该key未找到或无法解析,则返回0.0。
从:2.12
gchar ** g_key_file_get_string_list ()
返回与group_name下的key关联的value。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 如果找不到group_name,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_GROUP_NOT_FOUND。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
length
返回返回的字符串数量的位置,或NULL。
error
返回GError的位置,或NULL
返回
以NULL结尾的字符串数组或NULL,如果找不到指定的key。 该数组应该用g_strfreev()释放。
gchar ** g_key_file_get_locale_string_list ()
如果可用,则返回在给定语言环境中翻译的group_name下与key关联的value。 如果locale设置为NULL,则假定当前区域设置。
如果locale设置为非NULL,或者当前语言环境将在GKeyFile的生命周期内更改,则必须使用G_KEY_FILE_KEEP_TRANSLATIONS加载,以便为所有语言环境加载字符串。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 如果与key相关的value无法解释或者找不到合适的翻译,则返回未转换的值。 返回的数组以NULL结尾,所以长度可以选择为NULL。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
locale
一个区域标识符或NULL。
length
返回返回的字符串数量或NULL的位置。
error
返回GError或NULL的位置
返回
一个新分配的以NULL结尾的字符串数组,如果未找到该key,则返回NULL。 字符串数组应该用g_strfreev()来释放。
gboolean * g_key_file_get_boolean_list ()
返回与group_name下的key关联的value,作为布尔值。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key关联的value不能被解释为布尔值,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
length
返回的布尔值的数量。
error
返回GError的位置
返回
与key关联的value作为布尔值列表;如果key未找到或无法解析,则返回NULL。 返回的布尔值列表应该在不再需要时使用g_free()来释放。
gint * g_key_file_get_integer_list ()
以整数形式返回与group_name下的key关联的value。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key相关的value不能被解释为整数,或者超出gint的范围,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
length
返回的整数数量。
error
返回GError的位置
返回
与key关联的value作为整数列表;如果key未找到或无法解析,则返回NULL。 当不再需要时,返回的整数列表应该用g_free()来释放。
gdouble * g_key_file_get_double_list ()
返回与group_name下的key相关的value作为双精度值。
如果找不到key,则返回NULL并将错误设置为G_KEY_FILE_ERROR_KEY_NOT_FOUND。 同样,如果与key关联的value不能被解释为双精度型,则返回NULL,并将错误设置为G_KEY_FILE_ERROR_INVALID_VALUE。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
length
返回的双打数量。
error
返回GError的位置
返回
与key相关联的value作为双精度列表,如果key未找到或无法解析,则返回NULL。 当不再需要时,返回的双打列表应该用g_free()释放。
gchar * g_key_file_get_comment ()
从group_name中检索key上的注释。 如果key为NULL,则将从group_name上面读取注释。 如果key和group_name都为NULL,则将从文件的第一组上方读取注释。
请注意,返回的字符串包含'#'注释标记。
参数
key_file
一个GKeyFile
group_name
一个组名,或NULL。
key
关键
error
返回GError的位置
返回
一个应该用g_free()释放的注释
由于:2.6
void g_key_file_set_value ()
将一个新value与group_name下的key关联。
如果找不到key,则会创建该key。 如果找不到group_name,则会创建它。 要设置可能包含需要转义的字符(如换行符或空格)的UTF-8字符串,请使用g_key_file_set_string()。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
一个字符串
由于:2.6
void g_key_file_set_string ()
将新的字符串value与group_name下的key关联。 如果找不到key,则会创建该key。 如果找不到group_name,则会创建它。 与g_key_file_set_value()不同,此函数处理需要转义的字符,如换行符。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
string
一个字符串
由于:2.6
void g_key_file_set_locale_string ()
为group_name下的key和语言环境关联一个字符串value。 如果找不到key的翻译,则会创建它。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
locale
一个区域标识符
string
一个字符串
由于:2.6
void g_key_file_set_boolean ()
将一个新的布尔值与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
TRUE或FALSE
由于:2.6
void g_key_file_set_integer ()
将一个新的整数value与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
一个整数值
由于:2.6
void g_key_file_set_int64 ()
将一个新的整数值与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
一个整数值
从:2.26
void g_key_file_set_uint64 ()
将一个新的整数值与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
一个整数值
从:2.26
void g_key_file_set_double ()
将一个新的double值与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
value
double值
从:2.12
void g_key_file_set_string_list ()
在group_name下关联字符串value列表。 如果找不到key,则会创建该key。 如果找不到group_name,则会创建它。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
list
一个字符串值的数组。
length
列表中的字符串值数量
由于:2.6
void g_key_file_set_locale_string_list ()
将group_name下的key和语言环境的字符串值列表关联起来。 如果找不到key的翻译,则会创建它。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
locale
一个区域标识符
list
一个以NULL结尾的语言环境字符串值数组。
length
列表的长度
由于:2.6
void g_key_file_set_boolean_list ()
将布尔值列表与group_name下的key关联。 如果找不到key,则会创建该key。 如果group_name为NULL,则使用start_group。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
list
一个布尔值数组。
length
列表的长度
由于:2.6
void g_key_file_set_integer_list ()
将整数值列表与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
list
整数值的数组。
length
列表中的整数值个数
由于:2.6
void g_key_file_set_double_list ()
将double值的列表与group_name下的key关联。 如果找不到key,则会创建该key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
关键
list
一个double值的数组。
length
列表中的double值的数量
从:2.12
gboolean g_key_file_set_comment ()
在group_name的上方放置注释。
如果key为NULL,则注释将写在group_name上方。 如果key和group_name都为NULL,则注释将写入文件中第一个组的上方。
请注意,该函数在每行注释前加上一个'#'注释标记。
参数
key_file
一个GKeyFile
group_name
一个组名,或NULL。
key
关键。
comment
一条评论
error
返回GError的位置
返回
如果评论已写入则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_remove_group ()
从key file中删除指定的group_name。
参数
key_file
一个GKeyFile
group_name
一个组名
error
返回GError或NULL的位置
返回
如果该组被删除则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_remove_key ()
从key file中删除group_name中的key。
参数
key_file
一个GKeyFile
group_name
一个组名
key
要删除的关键名称
error
返回GError或NULL的位置
返回
如果键被移除则为TRUE,否则为FALSE
由于:2.6
gboolean g_key_file_remove_comment ()
从group_name删除以上注释的注释。 如果key为NULL,则在group_name上方删除注释。 如果key和group_name都为NULL,则注释将被删除到文件中第一个组的上方。
参数
key_file
一个GKeyFile
group_name
一个组名,或NULL。
key
关键。
error
返回GError的位置
返回
如果评论已被删除则为TRUE,否则为FALSE
由于:2.6
类型和值
GKeyFile
GKeyFile结构只包含私有数据,不应直接访问。
#define G_KEY_FILE_ERROR
密钥文件解析的错误域。 此域中的错误将来自GKeyFileError枚举。
有关错误域的信息,请参阅GError。
enum GKeyFileError
密钥文件解析返回的错误代码。
成员
G_KEY_FILE_ERROR_UNKNOWN_ENCODING
被解析的文本是未知的编码
G_KEY_FILE_ERROR_PARSE
文件格式不正确
G_KEY_FILE_ERROR_NOT_FOUND
该文件未找到
G_KEY_FILE_ERROR_KEY_NOT_FOUND
没有找到请求的密钥
G_KEY_FILE_ERROR_GROUP_NOT_FOUND
没有找到请求的组
G_KEY_FILE_ERROR_INVALID_VALUE
一个值不能被解析
enum GKeyFileFlags
影响解析的标志。
成员
G_KEY_FILE_NONE
没有标志,默认行为
G_KEY_FILE_KEEP_COMMENTS
如果您打算将key file的(可能已修改的)内容写回文件,请使用此标志; 否则当key file被写回时,所有注释都将丢失。
G_KEY_FILE_KEEP_TRANSLATIONS
如果您打算将key file的(可能已修改的)内容写回文件,请使用此标志; 否则只有当前语言的翻译才会被写回。
下面提供一下读取文件和写文件的示例代码,代码几乎将所有函数包含进入。
读文件代码
首先准备一个.ini文件key-file.ini
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping 测试
Booleanval = false
Integerval = 12355
Int64val = 9223372036854775800
Uint64val = 18446744073709551615
Doubleval = 3.1415926
# 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
Strings = string1;string2;string3;string4;string5
Booleans=true;false;true;true
Doubles = 1.1;42.111;3.221;462.12345
readkeyvalue.c
#include
#include
int main(int argc, char **argv)
{
g_printf ("%s in\n", __func__);
GError *error = NULL;
GKeyFile *key_file = g_key_file_new ();
if (!g_key_file_load_from_file (key_file, "key-file.ini", G_KEY_FILE_KEEP_TRANSLATIONS|G_KEY_FILE_KEEP_COMMENTS, &error))
{
if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error loading key file: %s", error->message);
if (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error loading key file: %s", error->message);
g_error_free (error);
g_key_file_free (key_file);
return 0;
}
gchar *start_group = g_key_file_get_start_group (key_file);
if (start_group == NULL)
{
// Fall back to a default value.
g_warning ("start_group is NULL");
}
else
{
g_printf ("start_group = %s\n", start_group);
g_free(start_group);
}
gsize length;
gchar **groups = g_key_file_get_groups (key_file, &length);
if (groups == NULL)
{
// Fall back to a default value.
g_warning ("groups is NULL");
}
else
{
g_printf ("groups length = %ld\n", length);
gint i;
for (i=0; imessage);
}
else if (keys == NULL)
{
// Fall back to a default value.
g_warning ("keys is NULL");
}
else
{
g_printf ("keys length = %ld\n", length);
gint i;
for (i=0; imessage);
g_error_free (error);
error = NULL;
}
else
{
has_key ? g_printf ("key_file has key Welcome\n") : g_printf ("key_file not has key Welcome\n");
}
gchar *get_value =
g_key_file_get_value (key_file,
"First Group",
"Name",
&error);
if( error != NULL )
{
g_warning ("Error get value key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else if (get_value == NULL)
{
// Fall back to a default value.
g_warning ("get_value is NULL");
}
else
{
g_printf ("get_value Name = %s\n", get_value);
g_free (get_value);
}
gchar *get_locale_string =
g_key_file_get_locale_string (key_file,
"First Group",
"Welcome",
"fr_FR",
&error);
if( error != NULL )
{
g_warning ("Error get locale string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else if (get_locale_string == NULL)
{
// Fall back to a default value.
g_warning ("get_locale_string is NULL");
}
else
{
g_printf ("get_locale_string Welcome[fr_FR] = %s\n", get_locale_string);
g_free (get_locale_string);
}
gchar * get_string =
g_key_file_get_string (key_file,
"First Group",
"Name",
&error);
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else if (get_string == NULL)
{
// Fall back to a default value.
g_warning ("get_string is NULL");
}
else
{
g_printf ("get_string Name = %s\n", get_string);
g_free (get_string);
}
gboolean get_boolean =
g_key_file_get_boolean (key_file,
"First Group",
"Booleanval",
&error);
if( error != NULL )
{
g_warning ("Error get boolean key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else
{
get_boolean ? g_printf ("key_file Booleanval is true\n") : g_printf ("key_file Booleanval is false\n");
}
gint get_integer =
g_key_file_get_integer (key_file,
"First Group",
"Integerval",
&error);
if( error != NULL )
{
g_warning ("Error get integer key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else
{
g_printf ("get_integer Integerval = %d\n", get_integer);
}
gint64 get_int64 =
g_key_file_get_int64 (key_file,
"First Group",
"Int64val",
&error);
if( error != NULL )
{
g_warning ("Error get int64 key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else
{
g_printf ("get int64 Int64val = %ld\n", get_int64);
}
guint64 get_uint64 =
g_key_file_get_uint64 (key_file,
"First Group",
"Uint64val",
&error);
if( error != NULL )
{
g_warning ("Error get uint64 key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else
{
g_printf ("get uint64 Uint64val = %lu\n", get_uint64);
}
gdouble get_double =
g_key_file_get_double (key_file,
"First Group",
"Doubleval",
&error);
if( error != NULL )
{
g_warning ("Error get double key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else
{
g_printf ("get double Doubleval = %f\n", get_double);
}
gchar **string_list =
g_key_file_get_string_list (key_file,
"Another Group",
"Strings",
&length,
&error);
if( error != NULL )
{
g_warning ("Error get string list key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else if (string_list == NULL)
{
// Fall back to a default value.
g_warning ("string_list is NULL");
}
else
{
g_printf ("Strings length = %ld\n", length);
gint i;
for (i=0; imessage);
g_error_free (error);
error = NULL;
}
else if (boolean_list == NULL)
{
// Fall back to a default value.
g_warning ("boolean_list is NULL");
}
else
{
g_printf ("Booleans length = %ld\n", length);
gint i;
for (i=0; imessage);
g_error_free (error);
error = NULL;
}
else if (integer_list == NULL)
{
// Fall back to a default value.
g_warning ("integer_list is NULL");
}
else
{
g_printf ("Numbers length = %ld\n", length);
gint i;
for (i=0; imessage);
g_error_free (error);
error = NULL;
}
else if (double_list == NULL)
{
// Fall back to a default value.
g_warning ("double_list is NULL");
}
else
{
g_printf ("Doubles length = %ld\n", length);
gint i;
for (i=0; imessage);
g_error_free (error);
error = NULL;
}
else if (get_comment == NULL)
{
// Fall back to a default value.
g_warning ("get_comment is NULL");
}
else
{
g_printf ("Comment = %s\n", get_comment);
g_free (get_comment);
}
//----------------------------DATA-------------------------------//
const gchar *data =
g_key_file_to_data (key_file,
&length,
&error);
g_printf ("key file to data length = %ld\n", length);
g_printf ("key file to data = \n%s\n", data);
if (!g_key_file_load_from_data (key_file, data, (gsize)-1, G_KEY_FILE_KEEP_TRANSLATIONS|G_KEY_FILE_KEEP_COMMENTS, &error))
{
g_warning ("Error loading key data: %s", error->message);
g_error_free (error);
g_key_file_free (key_file);
return 0;
}
get_string =
g_key_file_get_string (key_file,
"First Group",
"Name",
&error);
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
else if (get_string == NULL)
{
// Fall back to a default value.
g_warning ("get_string is NULL");
}
else
{
g_printf ("get_string Name = %s\n", get_string);
g_free (get_string);
}
//----------------------------data_dirs-------------------------------//
if(!g_setenv ("XDG_DATA_HOME", "/home/renz/ggtest", FALSE))
{
g_warning ("g_setenv is false");
}
g_printf ("g_get_user_data_dir() = %s\n", g_get_user_data_dir ());
gchar *full_path = NULL;
if (!g_key_file_load_from_data_dirs (key_file, "key-file.ini", &full_path, G_KEY_FILE_KEEP_TRANSLATIONS|G_KEY_FILE_KEEP_COMMENTS, &error))
{
g_warning ("Error loading from data dirs: %s", error->message);
g_error_free (error);
g_key_file_free (key_file);
return 0;
}
if(full_path != NULL)
{
g_printf ("full_path = %s\n", full_path);
}
g_key_file_free (key_file);
g_printf ("%s out\n", __func__);
return 0;
}
输出结果:
main in
start_group = First Group
groups length = 2
groups[0] = First Group
groups[1] = Another Group
keys length = 11
keys[0] = Name
keys[1] = Booleanval
keys[2] = Integerval
keys[3] = Int64val
keys[4] = Uint64val
keys[5] = Doubleval
keys[6] = Welcome
keys[7] = Welcome[de]
keys[8] = Welcome[fr_FR]
keys[9] = Welcome[it]
keys[10] = Welcome[be@latin]
key_file has group First Group
key_file not has group Second Group
key_file has key Welcome
get_value Name = Key File Example\tthis value shows\nescaping 测试
get_locale_string Welcome[fr_FR] = Bonjour
get_string Name = Key File Example this value shows
escaping 测试
key_file Booleanval is false
get_integer Integerval = 12355
get int64 Int64val = 9223372036854775800
get uint64 Uint64val = 18446744073709551615
get double Doubleval = 3.141593
Strings length = 5
Strings[0] = string1
Strings[1] = string2
Strings[2] = string3
Strings[3] = string4
Strings[4] = string5
Booleans length = 4
Booleans[0] = true
Booleans[1] = false
Booleans[2] = true
Booleans[3] = true
Numbers length = 4
Numbers[0] = 2
Numbers[1] = 20
Numbers[2] = -200
Numbers[3] = 0
Doubles length = 4
Doubles[0] = 1.100000
Doubles[1] = 42.111000
Doubles[2] = 3.221000
Doubles[3] = 462.123450
Comment = localized strings are stored in multiple key-value pairs
key file to data length = 566
key file to data =
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping 测试
Booleanval=false
Integerval=12355
Int64val=9223372036854775800
Uint64val=18446744073709551615
Doubleval=3.1415926
# 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
Strings=string1;string2;string3;string4;string5
Booleans=true;false;true;true
Doubles=1.1;42.111;3.221;462.12345
get_string Name = Key File Example this value shows
escaping 测试
g_get_user_data_dir() = /home/renz/ggtest
full_path = /home/renz/ggtest/key-file.ini
main out
写文件例程
#include
#include
int main(int argc, char **argv)
{
g_printf ("%s in\n", __func__);
GError *error = NULL;
GKeyFile *key_file = g_key_file_new ();
if (!g_key_file_load_from_file (key_file, "key-file.ini", G_KEY_FILE_KEEP_TRANSLATIONS|G_KEY_FILE_KEEP_COMMENTS, &error))
{
if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error loading key file: %s", error->message);
if (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error loading key file: %s", error->message);
g_error_free (error);
g_key_file_free (key_file);
return 0;
}
gsize length;
const gchar *data =
g_key_file_to_data (key_file,
&length,
&error);
g_printf ("key file to data length = %ld\n", length);
g_printf ("key file to data = \n%s\n", data);
g_key_file_set_value (key_file,
"Create Group",
"new key",
"new vlaue");
g_key_file_set_string (key_file,
"Create Group",
"new string",
"Key File Example\tthis value shows\nescaping 测试");
g_key_file_set_locale_string (key_file,
"Create Group",
"new string",
"der",
"heillen");
g_key_file_set_boolean (key_file,
"Create Group",
"new boolean",
TRUE);
g_key_file_set_integer (key_file,
"Create Group",
"new integer",
233333);
g_key_file_set_int64 (key_file,
"Create Group",
"new int64",
9223372036854775744);
g_key_file_set_uint64 (key_file,
"Create Group",
"new uint64",
18446744073709551600u);
g_key_file_set_double (key_file,
"Create Group",
"new double",
3.1415926);
const gchar * const string_list[] = {"aaaa", "bbbbbb", "cccccccccc"};
g_key_file_set_string_list (key_file,
"Create Group",
"new string list",
string_list,
G_N_ELEMENTS(string_list));
gboolean boolean_list[] = {TRUE, FALSE, FALSE, TRUE};
g_key_file_set_boolean_list (key_file,
"Create Group",
"new boolean list",
boolean_list,
G_N_ELEMENTS(boolean_list));
gint integer_list[] = {123, 444, 122, 4};
g_key_file_set_integer_list (key_file,
"Create Group",
"new integer list",
integer_list,
G_N_ELEMENTS(integer_list));
gdouble double_list[] = {1.1, 2.2, 3.3, 4.4, 5.5};
g_key_file_set_double_list (key_file,
"Create Group",
"new double list",
double_list,
G_N_ELEMENTS(double_list));
if (!g_key_file_set_comment (key_file,
"Create Group",
"new double list",
"g_key_file_set_comment",
&error))
{
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
}
if (!g_key_file_remove_group (key_file,
"Another Group",
&error))
{
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
}
if (!g_key_file_remove_key (key_file,
"First Group",
"Name",
&error))
{
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
}
if (!g_key_file_remove_comment (key_file,
NULL,
NULL,
&error))
{
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
}
if (!g_key_file_save_to_file (key_file, "key-file_ex.ini", &error))
{
if( error != NULL )
{
g_warning ("Error get string key_file: %s", error->message);
g_error_free (error);
error = NULL;
}
}
g_key_file_free (key_file);
g_printf ("%s out\n", __func__);
return 0;
}
输出结果:
main in
key file to data length = 566
key file to data =
# this is just an example
# there can be comments before the first group
[First Group]
Name=Key File Example\tthis value shows\nescaping 测试
Booleanval=false
Integerval=12355
Int64val=9223372036854775800
Uint64val=18446744073709551615
Doubleval=3.1415926
# 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
Strings=string1;string2;string3;string4;string5
Booleans=true;false;true;true
Doubles=1.1;42.111;3.221;462.12345
main out
key-file_ex.ini
[First Group]
Booleanval=false
Integerval=12355
Int64val=9223372036854775800
Uint64val=18446744073709551615
Doubleval=3.1415926
# 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
[Create Group]
new key=new vlaue
new string=Key File Example this value shows\nescaping 测试
new string[der]=heillen
new boolean=true
new integer=233333
new int64=9223372036854775744
new uint64=18446744073709551600
new double=3.1415926000000001
new string list=aaaa;bbbbbb;cccccccccc;
new boolean list=true;false;false;true;
new integer list=123;444;122;4;
#g_key_file_set_comment
new double list=1.1000000000000001;2.2000000000000002;3.2999999999999998;4.4000000000000004;5.5;