Работа с ini на C#
Наверно это не самый лучший стиль программирования, но настройки большинства своих программ я привык хранить в их теле. Или вообще делать их неизменяемыми – так как изначально затачивать под конкретного человека. Но вот в одном заказе (программа для приема в печать для одной фотостудии) клиент попросил вынести настройки приложения в отдельный файл – ini. Ну что ж, раз надо – сделаем.
На самом деле я был несколько удивлен, не найдя готовых решений, уже встроенных в .NET. Оказывается, макрософт вообще не рекмоендует ини файлы, а вместо этого предлагает использовать реестр или xml. Но нам наплевать на рекомендации майкрософта, нам главное – удовлетворить заказчика. Итак, пишем свой код для работы с ini-файлами. Работать будет от XP и до Window 10:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
namespace Foto
{
class IniFiles
{
string Path; //Имя файла.
[DllImport("kernel32", CharSet = CharSet.Auto)] // Подключаем kernel32.dll и описываем его функцию WritePrivateProfilesString
static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);
[DllImport("kernel32", CharSet = CharSet.Auto)] // Еще раз подключаем kernel32.dll, а теперь описываем функцию GetPrivateProfileString
static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);
// С помощью конструктора записываем пусть до файла и его имя.
public IniFiles(string IniPath)
{
Path = new FileInfo(IniPath).FullName.ToString();
}
//Читаем ini-файл и возвращаем значение указного ключа из заданной секции.
public string ReadINI(string Section, string Key)
{
var RetVal = new StringBuilder(255);
GetPrivateProfileString(Section, Key, "", RetVal, 255, Path);
return RetVal.ToString();
}
//Записываем в ini-файл. Запись происходит в выбранную секцию в выбранный ключ.
public void Write(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, Path);
}
//Удаляем ключ из выбранной секции.
public void DeleteKey(string Key, string Section = null)
{
Write(Section, Key, null);
}
//Удаляем выбранную секцию
public void DeleteSection(string Section = null)
{
Write(Section, null, null);
}
//Проверяем, есть ли такой ключ, в этой секции
public bool KeyExists(string Section, string Key)
{
return ReadINI(Section, Key).Length > 0;
}
//читаем в массив все пары ключей-значнией в данной секции
public bool GetPrivateProfileSection(string appName, string fileName, out string[] section)
{
section = null;
if (!System.IO.File.Exists(fileName))
return false;
const uint MAX_BUFFER = 32767;
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
uint bytesReturned = GetPrivateProfileSection(appName, pReturnedString, MAX_BUFFER, fileName);
if ((bytesReturned == MAX_BUFFER - 2) || (bytesReturned == 0))
{
Marshal.FreeCoTaskMem(pReturnedString);
return false;
}
string returnedString = Marshal.PtrToStringAuto(pReturnedString, (int)(bytesReturned - 1));
section = returnedString.Split('\0');
Marshal.FreeCoTaskMem(pReturnedString);
return true;
}
}
}
Работать со всем этим проще простого. Например, прочитать значение (размер шрифта):
IniFiles INI = new IniFiles("config.ini");
font_raz = Convert.ToInt32(INI.ReadINI("Общие настройки", "Шрифт"));
Узнать, сколько значений в секции:
string file = Path.GetFullPath("config.ini");
string section = "Типы бумаги";
if (INI.GetPrivateProfileSection(section, file, out bumag))
{
MessageBox.Show(bumag.Length.ToString());
}
Структура файла у нас такая:
Стоит обратить внимание на кодировки программы и файла ini – в случае несовпадения могут быть проблемы с кириллицей. Ну а у нас проблем нет:

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты