Отправляет email-рассылки с помощью сервиса Sendsay

Практические советы по GTK+

  Все выпуски  

Практические советы по GTK+ Работа с файлом настроек


В составе GTK+ на мой взгляд есть довольно интересные функции для сохранения/чтения настроек из текстового файла.
Называются они g_key_file API и расположены в библиотеке GLib [появились в версии GTK+ 2.6 (в конце 2004г.)]
С помощью этих функций Вы можете сохранять настройки приложения в текстовый файл,
который можно будет посмотреть/отредактировать в обычном текстовом редакторе.
        
Вот пример файла настроек:

[Common]
auto_run=true
# имя файла помощи к программе
path_help=help.chm
path_help[ru]=help_ru.chm
path_help[fr]=help_fr.chm
[Layout]
coordinates=15;10;320;240


Подробно синтаксис файлов настроек описывается в http://freedesktop.org/Standards/desktop-entry-spec
А если кратко, то файл состоит из групп, имена которых выделенных ковычками [], внутри которых хранятся переменные.
В нашем примере есть две группы: Common и Layout.
Переменные могут быть разных типов: строка, булевая переменная, целое число и число сплавающей точкой.
А также в одной переменной может быть список величин вышепреведённых типов, например, в нашем файле переменная coordinates из группы Layout - это список целых чисел.
Строковые переменные могут отличаться для разных языков, что может быть удобно при локализации приложения.

Вот пример чтения из настроек:
GError *error;
gchar *str1,*str2;
GKeyFile *ini_file = g_key_file_new();
// читаем файл настроек
ret = g_key_file_load_from_file(ini_file,"test.ini",G_KEY_FILE_KEEP_COMMENTS,&error);
// читаем переменную path_help из группы Common
str1 = g_key_file_get_string(ini_file,"Common","path_help",&error);
// читаем переменную path_help из группы Common для русской локали
str2 = g_key_file_get_locale_string(ini_file,"Common","path_help","ru",&error);
// когда закончили работать с файлом настроек, закрываем GKeyFile
g_key_file_free(ini_file);
// когда нам больше не понадобятся считанные переменные, чистим выделенную под них память
g_free(str1);
g_free(str2);


Пример записи в файл настроек:
GError *error;
gchar *str_data;
GKeyFile *ini_file = g_key_file_new();
// в качестве разделителя внутри списковых переменных будет выступать запятая.
g_key_file_set_list_separator (ini_file, ',');
// записываем переменную bool_test в группу "new group"
g_key_file_set_boolean(ini_file,"new group","bool_test",TRUE);
// Данные сами в файл не запишутся, по сути функции с префиксом g_key_ работают с буфером в памяти
// и чтобы сохранить настройки в файл, необходимо проделать дополнительную операцию сохранения изменений в файл
str_data = g_key_file_to_data (ini_file, &len, NULL);
g_file_set_contents ("test.ini", str_data, len, NULL);
g_free (str_data);
// когда закончили работать с файлом настроек, закрываем GKeyFile
g_key_file_free(ini_file);



При загрузке файла настроек через g_key_file_load_from_file()
можно использовать несколько флагов:
G_KEY_FILE_KEEP_COMMENTS - Используйте этот флаг если Вы собираетесь вручную смотреть/модифицировать ключевой файл; в противном случае все комментарии будут потеряны при перезаписи.
G_KEY_FILE_KEEP_TRANSLATIONS - Используйте этот флаг если Вы собираетесь хранить несколько переводов одной переменной.

При чтении переменных не нужно заботится о резервировании памяти под возвращаемую строку,
память будет выделена автоматически в требуемом количестве. Главное не забыть потом её почистить через g_free();

При записи в файл, он должен существовать и в нём должна быть создата хоть какая-то группа.
Если группа или переменная не существуют, то они будут созданы.

Более подробную документацию можно найти в файле помощи из состава GTK+: glib-Key-value-file-parser.html
Вот часть прототипов функций библиотеки g_key_file:
Считать все группы из файла настроек:
gchar**   g_key_file_get_groups      (GKeyFile *key_file,gsize *length);
Считать имена всех переменных заданной группы в файле настроек:
gchar**   g_key_file_get_keys        (GKeyFile *key_file,const gchar *group_name,gsize *length,GError **error);
Считать переменную из файла настроек:
gchar*    g_key_file_get_string      (GKeyFile *key_file,const gchar *group_name,const gchar *key,GError **error);
gboolean  g_key_file_get_boolean     (GKeyFile *key_file,const gchar *group_name,const gchar *key,GError **error);
gint      g_key_file_get_integer     (GKeyFile *key_file,const gchar *group_name,const gchar *key,GError **error);
gdouble   g_key_file_get_double      (GKeyFile *key_file,const gchar *group_name,const gchar *key,GError **error);
Считать список переменных из файла настроек:
gchar**   g_key_file_get_string_list (GKeyFile *key_file,const gchar *group_name,const gchar *key,gsize *length,GError **error);
gboolean* g_key_file_get_boolean_list(GKeyFile *key_file,const gchar *group_name,const gchar *key,gsize *length,GError **error);
gint*     g_key_file_get_integer_list(GKeyFile *key_file,const gchar *group_name,const gchar *key,gsize *length,GError **error);
gdouble*  g_key_file_get_double_list (GKeyFile *key_file,const gchar *group_name,const gchar *key,gsize *length,GError **error);
Записать переменную в файл настроек:
void      g_key_file_set_string      (GKeyFile *key_file,const gchar *group_name,const gchar *key,const gchar *string);
void      g_key_file_set_boolean     (GKeyFile *key_file,const gchar *group_name,const gchar *key,gboolean value);
void      g_key_file_set_integer     (GKeyFile *key_file,const gchar *group_name,const gchar *key,gint value);
void      g_key_file_set_double      (GKeyFile *key_file,const gchar *group_name,const gchar *key,gdouble value);
Записать список переменных в файл настроек:
void      g_key_file_set_string_list (GKeyFile *key_file,const gchar *group_name,const gchar *key,const gchar * const list[],gsize length);
void      g_key_file_set_boolean_list(GKeyFile *key_file,const gchar *group_name,const gchar *key,gboolean list[],gsize length);
void      g_key_file_set_integer_list(GKeyFile *key_file,const gchar *group_name,const gchar *key,gint list[],gsize length);
void      g_key_file_set_double_list (GKeyFile *key_file,const gchar *group_name,const gchar *key,gdouble list[],gsize length);
Удалить группу из файла настроек:
gboolean  g_key_file_remove_group    (GKeyFile *key_file,const gchar *group_name,GError **error);
Удалить переменную заданной группы из файла настроек:
gboolean  g_key_file_remove_key      (GKeyFile *key_file,const gchar *group_name,const gchar *key,GError **error);

 

В избранное