01 апреля 2008

Файлы конфигурации в D

Честно говоря, для меня задача считывания и сохранения настроек программы всегда была трудноформализуемой: обращение к конфигурационным файлам может встречаться в любом месте программы, кроме того необходимо обеспечить сохранение настроек при выходе. В D эта задача оказалась удивительно просто решаемой благодаря модульности и ассоциативным массивам.
Код модуля конфигуратора.

module configurer;

import std.file;
import std.string;

// ассоциативный массив ключей
char[] [char[]] Conf;
// имя файла конфигурации
const char[] INI_FILE = "informer.ini";

/* Статический конструктор, вызов генерируется
* в месте подключения модуля
*/
static this() {
// если файл существует
if (exists(INI_FILE)) {
// пробуем
try {
// прочитать его
char[] text = cast(char[])read(INI_FILE);
// цикл по строкам
foreach (line; splitlines(text)) {
// пропускаем комментарии
if(line[0] == ';') continue;
// выделяем имя и значение ключа и
auto token = split(line, ['=']);
// записываем в массив
if (token.length == 2) Conf[token[0]] = token[1];
}
}
catch (FileException e) {
}
}
}

/* статический деструктор, гарантированно
* вызывается при выходе из программы
*/
static ~this() {
char[] text = ";Configuration file\n";
foreach (key; Conf.keys) {
// сериализуем массив в строку
text ~= key ~ "=" ~ Conf[key] ~ "\n";
}
try {
// и записываем в файл
write (INI_FILE, text);
}
catch (FileException e) {
}
}


Теперь достоточно подключить конфигуратор:

import configurer;
, и настройки будут доступны как значения ассоциативного массива:

configurer.Conf["left"]


Дурацкое оформление комментариев связано с тем, что иначе текст не влазит в окно :(

Комментариев нет: