结构
GLibKeyFile
说明 [源代码]
struct GKeyFile {
/* No available fields */
}
GKeyFile
会解析类似 .ini 的配置文件。
GKeyFile
可以让您解析、编辑或创建包含成组键值对的文件,我们称之为“密钥文件”,因没有更好的名称。现在,多个 freedesktop.org 规范都在使用密钥文件,例如 Desktop Entry 规范 和 Icon Theme 规范。
密钥文件的语法在 Desktop Entry 规范 中有详细描述,这里快速总结一下:密钥文件由成组的键值对组成,并穿插有注释。
# 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
[Another Group]
Numbers=2;20;-200;0
Booleans=true;false;true;true
以 ‘#’ 开头的行以及空白行被视为注释。
组由包含在 ‘[‘ 和 ‘]’ 中的组名称开头的标题行开始,并由下一组的开始或文件结尾隐式结束。每个键值对都必须包含在一个组中。
键值对通常采用 key=value
的形式,本地化字符串除外,本地化字符串采用 key[locale]=value
的形式,语言环境标识符为 lang_COUNTRY@MODIFIER
,其中 COUNTRY
和 MODIFIER
是可选的。'=' 字符前后的空格将被忽略。值中的换行符、制表符、回车符和反斜杠字符将分别转义为 \n
、\t
、\r
和 \\\\
。为保留值中的前导空格,这些空格也可转义为 \s
。
键文件可以存储字符串(可能包含本地化变量)、整数、布尔值和这些值的列表。列表由分隔符字符分隔,通常是 ';' 或 ','。为在列表中的值中使用列表分隔符字符,必须使用反斜杠对其进行转义。
此语法明显受到 Windows 上常见的 .ini 文件的启发,但存在一些重要差异
-
.ini 文件使用 ';' 字符开始注释,键文件使用 '#' 字符。
-
键文件不允许非分组键,即只有注释才能位于第一个组之前。
-
键文件始终按 UTF-8 编码。
-
键和组名区分大小写。例如,名为 [GROUP] 的组与 [group] 不同。
-
.ini 文件没有严格类型的布尔条目类型,它们仅有 GetProfileInt()。在键文件中,只允许 true 和 false(小写)。
请注意,与 桌面条目规范 相反,键文件中的组可以多次包含同一键;最后一个条目将获胜。键文件还可以包含名称相同的多个组,这些组将合并在一起。另一个不同之处在于,键文件中的键和组名不受 ASCII 字符的限制。
以下是一个加载键文件并读取值的示例
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");
}
以下是一个创建并保存键文件的示例
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);
构造函数
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()
读取现有的键文件。
自:2.6
实例方法
g_key_file_get_comment
从 group_name
的 key
上方检索注释。如果 key
为 NULL
,那么 comment
将从 group_name
上方读取。如果 key
和 group_name
都是 NULL
,那么 comment
将从文件中第一个组上方读取。
自:2.6
g_key_file_get_double
将 group_name
下的与 key
关联的值作为双精度浮点数返回。如果 group_name
为 NULL
,则使用 start_group。
自:2.12
g_key_file_get_int64
返回与 group_name
下的 key
相关联的值,类型为有符号 64 位整数。这与 g_key_file_get_integer()
类似,但可以返回 64 位结果,且没有截断。
自版本 2.26 起
g_key_file_get_keys
返回与 group_name
组名相关联的所有键。返回的键的数组将会以 NULL
结尾,因此 length
可选为 NULL
。如果无法找到 group_name
,则返回 NULL
,并且 error
设置为 G_KEY_FILE_ERROR_GROUP_NOT_FOUND
。
自:2.6
g_key_file_get_locale_for_key
返回实际的语言环境, g_key_file_get_locale_string()
或 g_key_file_get_locale_string_list()
的结果从中产生。
自版本 2.56 起
g_key_file_get_locale_string
返回 group_name
下的 key
相关联的值,如果可用,则转化为指定的 locale
。如果 locale
为 NULL
,则将当前语言环境视作正确的语言环境。
自:2.6
g_key_file_get_locale_string_list
返回 group_name
下的 key
相关联的值,如果可用,则转化为指定的 locale
。如果 locale
为 NULL
,则将当前语言环境视作正确的语言环境。
自:2.6
g_key_file_get_string
返回与 group_name
下的 key
相关联的字符串值。与 g_key_file_get_value() 不同,此函数处理转义序列,例如 \s。
自:2.6
g_key_file_get_uint64
返回与 group_name
下的 key
相关联的值,类型为无符号 64 位整数。这与 g_key_file_get_integer()
类似,但可以返回较大的正整数结果,且没有截断。
自版本 2.26 起
g_key_file_get_value
返回与 group_name
下的 key
相关联的原始值。使用 g_key_file_get_string()
检索未转义的 UTF-8 字符串。
自:2.6
g_key_file_load_from_bytes
将 bytes
中的数据加载到一个空的 GKeyFile
结构中。如果无法创建该对象,则将 %error 设置为 GKeyFileError
。
自版本 2.50 起
g_key_file_load_from_data_dirs
此函数查找 g_get_user_data_dir()
和 g_get_system_data_dirs() 返回的路径中名为 file
的关键文件,将该文件加载到 key_file
中,并在 full_path
中返回文件的完整路径。如果无法加载文件,则将 %error 设置为 GFileError
或 GKeyFileError
。
自:2.6
g_key_file_load_from_dirs
此函数查找 search_dirs
指定的路径中名为 file
的关键文件,将该文件加载到 key_file
中,并在 full_path
中返回文件的完整路径。
自版本 2.14 起
g_key_file_remove_comment
从 group_name
中移除key
上方的注释。如果key
为 NULL
则将在group_name
上方移除comment
。如果key
和group_name
同时为NULL
,那么将移除文件第一个组上方的comment
。
自:2.6
g_key_file_save_to_file
使用 g_file_set_contents() 将 key_file
的内容写入 filename
。如果你需要明确保证已写入文件的耐用性,而不是 g_file_set_contents() 提供的保证,请使用 g_key_file_to_data() 的返回值加上 g_file_set_contents_full()
。
since: 2.40
g_key_file_set_boolean_list
在 group_name
下的 key
关联一个布尔值列表。如果找不到 key
,那么将创建一个。如果 group_name
为 NULL
,将使用 start_group。
自:2.6
g_key_file_set_locale_string_list
在 group_name
下的 key
和 locale
关联一个字符串值列表。如果找不到 key
的翻译,那么将创建一个。
自:2.6
g_key_file_set_string
在 group_name
下的 key
关联一个新的字符串值。如果找不到 key
,那么将创建一个。如果找不到 group_name
,那么将创建一个。此函数与 g_key_file_set_value() 不同之处在于,它处理需要转义的字符,例如换行符。
自:2.6
g_key_file_set_string_list
在 group_name
下的 key
关联一个字符串值列表。如果找不到 key
,那么将创建一个。如果找不到 group_name
,那么将创建一个。
自:2.6