Работа с *.INI файлами в VB.NET
Как правило, настраиваемые параметры приложения хранятся во внешних по отношению к программе расположениях. Имеется множество способов вынести настройки программы вне кода самой программы. Распространёнными способами являются: хранение параметров приложения в реестре Windows, в базах данных, в конфигурационных XML файлах, в файлах *.config или *.cfg, в специфических двоичных форматах и, конечно же, в *.ini файлах. Эти файлы мы сейчас и рассмотрим.
1Что такое INI-файлы
Что такое INI-файлы известно, наверное, каждому более-менее опытному пользователю операционной системы Windows. Зачастую файл с расширением *.INI – это самый быстрый и удобный способ вынести настраиваемые параметры приложения вне кода программы. Эти файлы имеют свою, довольно простую, структуру и, как правило, отличаются малыми размерами. Это обычные текстовые файлы, которые открываются даже в «Блокноте».
Вообще, INI-файл может иметь некоторые отступления от общепринятых норм, каждый разработчик определяет структуру и синтаксис файла для себя. Но есть некоторые общепринятые соглашения. Собственно, вот как выглядит структура INI-файла в общем виде:
; комментарий # комментарий в стиле Unix [Section1] ; комментарий key1=value_1 key2=value_2 [Section2] ;другой комментарий key3=value_3 ;ещё один комментарий key4=value_4
Видно, что *.INI файл может содержать:
- комментарии;
- заголовки разделов (секций);
- параметры в виде пары «ключ-значение»;
- пустые строки.
Пример INI-файла:
;;;;;;;;;;;;;;;;;;;;;;;;;; ; Copyright Soltau.ru ;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; [Settings] height=600 width=800 lang=RU
2Создание разделов и ключей INI-файлас помощью Visual Basic .NET и kernel32.dll
Можно изобретать велосипед и создать свой разборщик и генератор для INI-файлов. Но мы поступим более рационально и приземлённо и воспользуемся готовым решением из самой ОС Windows.
Дело в том, что в поставку любой операционной системы семейства Windows входит динамическая библиотека kernel32.dll. Эта библиотека расположена в системном каталоге Windows/system32. Она имеет множество функций для доступа к API Windows. В том числе и для работы с INI-файлами. Описывать все его возможности нет смысла, т.к. их великое множество (вот, например, описание kernel32 на 500+ страниц). Посмотреть все методы библиотеки можно с помощью наших старых знакомых DllExportViewer или DependencyWalker.
Нас здесь интересуют всего два метода: GetPrivateProfileString() для чтения ключей и разделов INI-файлов и WritePrivateProfileString() для записи.
Напишем класс-обёртку для упрощённого доступа к функциям работы с файлами *.INI, предоставляемым библиотекой kernel32:
Код класса IniFile.vb для работы с INI-файлами (разворачивается)
Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Text
Namespace Ini
Public Class IniFile
#Region "ИМПОРТ DLL"
''' <summary>
''' Записывает ключ в заданный раздел INI-файла.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
''' <param name="value">Значение ключа.</param>
''' <param name="filePath">Путь к INI-файлу.</param>
<DllImport("kernel32")>
Private Shared Function WritePrivateProfileString(ByVal section As String, ByVal key As String, ByVal value As String, ByVal filePath As String) As Long
End Function
''' <summary>
''' Считывает ключ заданного раздела INI-файла.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
''' <param name="[default]"></param>
''' <param name="retVal"></param>
''' <param name="size"></param>
''' <param name="filePath">Путь к INI-файлу.</param>
''' <remarks>С помощью конструктора записываем путь до файла и его имя. </remarks>
<DllImport("kernel32")>
Private Shared Function GetPrivateProfileString(ByVal section As String, ByVal key As String, ByVal [default] As String, ByVal retVal As StringBuilder, ByVal size As Integer, ByVal filePath As String) As Integer
End Function
#End Region '/ИМПОРТ DLL
#Region "КОНСТРУКТОР"
''' <summary>
''' Имя файла.
''' </summary>
Private IniPath As String
''' <summary>
''' Читаем ini-файл и возвращаем значение указного ключа из заданной секции.
''' </summary>
''' <param name="iniPath"></param>
Public Sub New(ByVal iniPath As String)
Me.IniPath = New FileInfo(iniPath).FullName.ToString
End Sub
#End Region '/КОНСТРУКТОР
#Region "МЕТОДЫ РАБОТЫ С INI-ФАЙЛАМИ"
''' <summary>
''' Проверяет, что заданный ключ существует в INI-файле.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
Public Function KeyExists(ByVal section As String, ByVal key As String) As Boolean
Return (Me.ReadKey(section, key).Length > 0)
End Function
''' <summary>
''' Читает значение заданного ключа в заданном разделе INI-файла.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
Public Function ReadKey(ByVal section As String, ByVal key As String) As String
Dim retVal As New StringBuilder(&HFF)
IniFile.GetPrivateProfileString(section, key, "", retVal, &HFF, Me.IniPath)
Return retVal.ToString()
End Function
''' <summary>
''' Создаёт заданный ключ в заданном разделе. Если раздел не существует, он будет создан.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
''' <param name="value">Значение ключа. Если NULL, то ключ будет удалён. Если String.Empty, то присвоится пустое значение.</param>
Public Sub WriteKey(ByVal section As String, ByVal key As String, ByVal value As String)
IniFile.WritePrivateProfileString(section, key, value, Me.IniPath)
End Sub
''' <summary>
''' Удаляет заданный ключ из заданного раздела INI-файла.
''' </summary>
''' <param name="section">Имя раздела.</param>
''' <param name="key">Имя ключа.</param>
Public Sub DeleteKey(ByVal section As String, ByVal key As String)
Me.WriteKey(section, key, Nothing)
End Sub
''' <summary>
''' Удаляет заданный раздел INI-файла.
''' </summary>
''' <param name="section">Имя раздела.</param>
Public Sub DeleteSection(ByVal section As String)
Me.WriteKey(section, Nothing, Nothing)
End Sub
#End Region '/МЕТОДЫ РАБОТЫ С INI-ФАЙЛАМИ
End Class
End Namespace
Использовать класс IniFile можно, например, так:
Dim iniFile as New IniFile("config.ini")
iniFile.WriteKey("SECTION1", "KEY1", "12345")
If iniFile.KeyExists("SECTION1", "KEY1")
MessageBox.Show("Ключ создан!")
iniFile.DeleteKey("SECTION1", "KEY1")
MessageBox.Show("Ключ удалён!")
End If
Поблагодарить автора:
Поделиться
1 Комментарий
-
ya 19.05.2018 19:40 КомментироватьУ меня почему-то при работе с INI файлами иногда происходят дублирование при вставке значений с помощью kernel32.dll.
