]>Файлы инициализации

Файлы инициализации

Аватар пользователя mabu

Практически любое программное обеспечение способно запоминать (сохранять) настройки, установленные пользователем. Например, внешний вид окна, язык, имя пользователя. В простых программах проще всего использовать файлы инициализации.

  1. Формат файла
  2. Функции для работы с ini‐файлами
    1. GetPrivateProfileString
    2. GetPrivateProfileInt
    3. WritePrivateProfileString
  3. Примеры
    1. Чтение файла
    2. Получение всех секций и ключей
    3. Запись в файл
    4. Удаление раздела или параметра
  4. Ссылки

Формат файла

Файлы с расширением *.ini широко распространены не только в мире Windows, но и в других системах, например, php.ini. Формат ini‐файла очень прост: файл разделён на секции (или разделы), в каждой секции может находиться произвольное число записей вида «параметр=значение». Секции указываются в квадратных скобках. Имена параметров в разных секциях могут совпадать.

В ini‐файлах предусмотрены комментарии — это строки, начинающиеся с точки с запятой.

Код INI‐файл
[секция_1]
параметр1=значение1
; это комментарий
параметр2=значение2

[секция_2]
параметр1=значение1
параметр2=значение2

Функции для работы с ini‐файлами

Существуют специальные функции, предназначенные для чтения и записи INI-файлов, они лежат в библиотеке kernel32.dll:

Эти функции работают со строками и существуют в двух вариантах: в ANSI‐версии и в юникодной версии, однако запись и чтение ini‐файлов в юникоде будет работать только если файл уже был ранее создан в юникоде (кодировка UTF-16 LE). То есть создать юникодный ini‐файл функцией WritePrivateProfileString нельзя, но можно создать сторонними программами, например, блокнотом.

GetPrivateProfileString

Получает строковое значение из INI‐файла.

Код FreeBASIC
Declare Function GetPrivateProfileString Alias "GetPrivateProfileStringW"( _
&t;ByVal lpAppName As LPCWSTR, _
&t;ByVal lpKeyName As LPCWSTR, _
&t;ByVal lpDefault As LPCWSTR, _
&t;ByVal lpReturnedString As LPWSTR, _
&t;ByVal nSize As DWORD, _
&t;ByVal lpFileName As LPCWSTR _
)As DWORD

Параметры

lpAppName
Имя секции для получения параметра. Если этот параметр равен NULL, то функция возвратит все секции в файле.
lpKeyName
Имя ключа. Если этот параметр равен NULL, то функция возвратит все включи в данной секции.
lpDefault
Значение по умолчанию, которое возвратит функция, если ключ не будет найден.
lpReturnedString
Указатель на буфер (строку), куда функция запишет значение ключа.
nSize
Размер передаваемого в функцию буфера (размер выделенной памяти в символах под строку).
lpFileName
Имя ini‐файла. Если используется относительный путь к файлу, то считается, что он лежит в папке Windows.

Возвращаемое значение

Функция возвращает количество скопированных символов в строку не включая нулевой символ. Для получения дополнительных сведений об ошибке можно вызвать функцию GetLastError.

GetPrivateProfileInt

Если значение в файле инициализации представлено числом, то его проще получить функцией GetPrivateProfileInt. Вот её определение из заголовочных файлов:

Код FreeBASIC
Declare Function GetPrivateProfileInt Alias "GetPrivateProfileIntW"( _
&t;ByVal lpAppName As LPCWSTR, _
&t;ByVal lpKeyName As LPCWSTR, _
&t;ByVal lpDefault As INT_, _
&t;ByVal lpFileName As LPCWSTR _
)As UINT

Параметры

lpAppName
Имя секции для получения параметра.
lpKeyName
Имя ключа.
nDefault
Значение по умолчанию, которое вернёт функция, если такового не будет в файле инициализации.
lpFileName
Имя INI‐файле. Если используется относительный путь к файлу, то считается, что он лежит в папке Windows.

Возвращаемое значение

Функция возвращает число, представленное в INI‐файле.

WritePrivateProfileString

Записывает значение в ini‐файл, а если такового не было, то создаёт его.

Код FreeBASIC
Declare Function WritePrivateProfileString Alias "WritePrivateProfileStringW"( _
&t;ByVal lpAppName As LPCWSTR, _
&t;ByVal lpKeyName As LPCWSTR, _
&t;ByVal lpString As LPCWSTR, _
&t;ByVal lpFileName As LPCWSTR _
)As WINBOOL

Параметры

lpAppName
Имя секции для записи.
lpKeyName
Имя ключа. Если этот параметр будет равен NULL, то вся секция будет удалена.
lpString
Строка, которая будет записана как значение ключа. Если этот параметр равен NULL, то ключ будет удалён.
lpFileName
Имя ini‐файла. Если используется относительный путь к файлу, то считается, что он лежит в папке Windows.

Возвращаемое значение

Если функция выполнилась успешно, то возвращаемое значение не ноль. При ошибке возвращаемое значение — ноль. Для получения дополнительных сведений об ошибке можно вызвать функцию GetLastError.

Примеры

Далее будут примеры использования с учётом юникода, а значит, программа будет корректно читать и записывать русские буквы.

Чтение файла

Создай в блокноте текстовый файл «configuration.ini» и сохрани его в кодировке Unicode (UTF-16):

Код INI‐файл
[Окно]
; Ширина и высота окна
Width=640
Height=480

; Параметры пользователя
[Пользователь]
Имя=Алексей

А теперь исходный код для чтения файла. Всё очень просто:

Код FreeBASIC
' Чтобы работать с юникодом
#define unicode
#include once "windows.bi"

' Полный путь к файлу
Const FileName = "E:\Programming\FreeBASIC Projects\INI\configuration.ini"
' Размер буфера
Const BufferSize As Integer = 255
Const SectionWindow = "Окно"
Const KeyWidth = "Width"
Const KeyHeight = "Height"
Const DefaultValue = "Значение по умолчанию"

' Значение из ini‐файла, которое мы получим
Dim Value As WString * (BufferSize + 1) ' Один символ под нулевой

' Функция GetPrivateProfileString возвращает количество символов, скопированных в буфер (Value)
' Если раздел или ключ не будут найдены, то в Value будет записано содержимое DefaultValue
Dim Result2 As DWORD = GetPrivateProfileString(SectionWindow, KeyWidth, DefaultValue, Value, BufferSize, FileName)
If Result2 > 0 Then
&t;Print KeyWidth, Value
End If
Result2 = GetPrivateProfileString(SectionWindow, KeyHeight, DefaultValue, Value, BufferSize, FileName)
If Result2 > 0 Then
&t;Print KeyHeight, Value
End If

Получение всех секций и ключей

Чтобы получить список всех секций, нужно в GetPrivateProfileString вместо имени секции передать Null. Функция заполнит возвращаемое значение Value строкой из всех разделов, разделённых символом с кодом 0. Аналогично для списка всех параметров в разделе: вместо имени требуемого параметра передать Null.

Код FreeBASIC
' Получение всех секций
Dim Result2 As DWORD = GetPrivateProfileString(Null, Null, DefaultValue, Value, BufferSize, FileName)
PrintResult(Value, Result2)

' Получение всех ключей
Result2 = GetPrivateProfileString(SectionWindow, Null, DefaultValue, Value, BufferSize, FileName)
PrintResult(Value, Result2)

' Печать результата
Sub PrintResult(ByRef Value As WString, ByVal ValueLength As Integer)
&t;Dim Start As Integer = 0
&t;Dim w As WString Ptr = Any
&t;Do While Start < ValueLength
&t;&t;' Получить указатель на начало строки
&t;&t;w = @Value[Start]
&t;&t;' Распечатать
&t;&t;Print *w
&t;&t;' Измерить длину строки, прибавить это к указателю + 1
&t;&t;Start += Len(*w) + 1
&t;Loop
End Sub

Запись в файл

Попробуем сменить имя пользователя:

Код FreeBASIC
Const SectionUser = "Пользователь"
Const KeyUser = "Имя"
Const UserName = "Саша"

' Функция возращает значение WinBool
Dim Result As WinBool = WritePrivateProfileString(SectionUser, KeyUser, UserName, FileName)
If Result Then
&t;Print "Запись удалась"
End If

Удаление раздела или параметра

Удаление — это запись NULL в ключ или раздел.

Удалим параметр «Имя» из раздела «Пользователь»:

Код FreeBASIC
Result = WritePrivateProfileString(SectionUser, KeyUser, NULL, FileName)
If Result Then
&t;Print "Удаление параметра успешно"
End If

Точно также можно удалять целые секции из ini‐файлов:

Код FreeBASIC
Result = WritePrivateProfileString(SectionUser, NULL, NULL, FileName)
If Result Then
&t;Print "Удаление секции успешно"
End If

Не забываем сохранять исходный код в кодировке UTF-8 или UTF-16, а сам ini‐файл в юникоде (UTF-16).

Ссылки

Поделись ссылочкой в социальных сетях