结构

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,其中 COUNTRYMODIFIER 是可选的。'=' 字符前后的空格将被忽略。值中的换行符、制表符、回车符和反斜杠字符将分别转义为 \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_error_quark
没有可用的描述。

实例方法

g_key_file_free

key_file 中清除所有键和组,并将引用计数减少 1。如果引用计数变为零,则释放键文件及其所有已分配的内存。

自:2.6

g_key_file_get_boolean

group_name 下与 key 关联的值作为布尔值返回。

自:2.6

g_key_file_get_boolean_list

将作为布尔值,返回与 group_name 下的 key 关联的值。

自:2.6

g_key_file_get_comment

group_namekey 上方检索注释。如果 keyNULL,那么 comment 将从 group_name 上方读取。如果 keygroup_name 都是 NULL,那么 comment 将从文件中第一个组上方读取。

自:2.6

g_key_file_get_double

group_name 下的与 key 关联的值作为双精度浮点数返回。如果 group_nameNULL,则使用 start_group。

自:2.12

g_key_file_get_double_list

将作为双精度浮点数返回与 group_name 下的 key 关联的值。

自:2.12

g_key_file_get_groups

返回用 key_file 加载的关键文件中的所有组。返回的组的数组将会以 NULL 结尾,因此 length 可选为 NULL

自:2.6

g_key_file_get_int64

返回与 group_name 下的 key 相关联的值,类型为有符号 64 位整数。这与 g_key_file_get_integer() 类似,但可以返回 64 位结果,且没有截断。

自版本 2.26 起

g_key_file_get_integer

返回与 group_name 下的 key 相关联的值,类型为整数。

自:2.6

g_key_file_get_integer_list

返回与 group_name 下的 key 相关联的值,类型为整数。

自:2.6

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。如果 localeNULL,则将当前语言环境视作正确的语言环境。

自:2.6

g_key_file_get_locale_string_list

返回 group_name 下的 key 相关联的值,如果可用,则转化为指定的 locale。如果 localeNULL,则将当前语言环境视作正确的语言环境。

自:2.6

g_key_file_get_start_group

返回文件的启动组的名称。

自:2.6

g_key_file_get_string

返回与 group_name 下的 key 相关联的字符串值。与 g_key_file_get_value() 不同,此函数处理转义序列,例如 \s。

自:2.6

g_key_file_get_string_list

返回与 group_name 下的 key 相关联的值。

自: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_has_group

查看关键文件是否具有 group_name 组。

自:2.6

g_key_file_has_key

查看关键文件是否在 group_name 组中具有 key 键。

自:2.6

g_key_file_load_from_bytes

bytes 中的数据加载到一个空的 GKeyFile 结构中。如果无法创建该对象,则将 %error 设置为 GKeyFileError

自版本 2.50 起

g_key_file_load_from_data

将关键文件从内存加载到一个空的 GKeyFile 结构中。如果无法创建该对象,则将 %error 设置为 GKeyFileError

自:2.6

g_key_file_load_from_data_dirs

此函数查找 g_get_user_data_dir() 和 g_get_system_data_dirs() 返回的路径中名为 file 的关键文件,将该文件加载到 key_file 中,并在 full_path 中返回文件的完整路径。如果无法加载文件,则将 %error 设置为 GFileErrorGKeyFileError

自:2.6

g_key_file_load_from_dirs

此函数查找 search_dirs 指定的路径中名为 file 的关键文件,将该文件加载到 key_file 中,并在 full_path 中返回文件的完整路径。

自版本 2.14 起

g_key_file_load_from_file

将关键文件加载到一个空的 GKeyFile 结构中。

自:2.6

g_key_file_ref

增加 key_file 的引用计数。

自版本 2.32 起

g_key_file_remove_comment

group_name 中移除key上方的注释。如果keyNULL 则将在group_name上方移除comment。如果keygroup_name同时为NULL,那么将移除文件第一个组上方的comment

自:2.6

g_key_file_remove_group

移除指定组 group_name 从密钥文件中。

自:2.6

g_key_file_remove_key

从密钥文件中移除 group_name 中的 key

自: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

group_name 下的 key 关联一个新的布尔值。如果找不到 key,那么将创建一个。

自:2.6

g_key_file_set_boolean_list

group_name 下的 key 关联一个布尔值列表。如果找不到 key,那么将创建一个。如果 group_nameNULL,将使用 start_group。

自:2.6

g_key_file_set_comment

group_name 中的 key 上方放置一个注释。

自:2.6

g_key_file_set_double

group_name 下的 key 关联一个新的双精度值。如果找不到 key,那么将创建一个。

自:2.12

g_key_file_set_double_list

group_name 下的 key 关联一个双精度值列表。如果找不到 key,那么将创建一个。

自:2.12

g_key_file_set_int64

group_name 下的 key 关联一个新整数。如果找不到 key,那么将创建一个。

自版本 2.26 起

g_key_file_set_integer

group_name 下的 key 关联一个新整数。如果找不到 key,那么将创建一个。

自:2.6

g_key_file_set_integer_list

group_name 下的 key 关联一个整数列表。如果找不到 key,那么将创建一个。

自:2.6

g_key_file_set_list_separator

设置用于分隔列表中值的字符。通常将‘;’或‘,’用作分隔符。默认列表分隔符为‘;’。

自:2.6

g_key_file_set_locale_string

group_name 下的 keylocale 关联一个字符串值。如果找不到 key 的翻译,那么将创建一个。

自:2.6

g_key_file_set_locale_string_list

group_name 下的 keylocale 关联一个字符串值列表。如果找不到 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

g_key_file_set_uint64

group_name 下的 key 关联一个新整数。如果找不到 key,那么将创建一个。

自版本 2.26 起

g_key_file_set_value

group_name 下的 key 中关联一个新值。

自:2.6

g_key_file_to_data

此函数将 key_file 作为字符串输出。

自:2.6

g_key_file_unref

key_file 的引用计数减少 1。如果引用计数为 0,释放密钥文件及其分配的所有内存。

自版本 2.32 起