C# INI

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.InteropServices;

namespace INI.IniFiles
{
/* 参考:INIファイルを読み書きするには?
* https://www.atmarkit.co.jp/fdotnet/dotnettips/039inifile/inifile.html
*/
class IniFiles
{
[DllImport("KERNEL32.DLL")]
private static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
uint nSize,
string lpFileName);

[DllImport("KERNEL32.DLL")]
private static extern uint GetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int nDefault,
string lpFileName);

[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA")]
public static extern uint GetPrivateProfileStringByByteArray(
string lpAppName,
string lpKeyName,
string lpDefault,
byte[] lpReturnedString,
uint nSize,
string lpFileName
);

[DllImport("KERNEL32.DLL")]
private static extern uint WritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName);

//*******************************************
// GetIniString
//
//*******************************************

///

<summary>
        /// INIファイルから値を取得する
/// </summary>        /// <param name="lpSection">セッション名称
        /// <param name="lpKeyName">キー名称
        /// <param name="lpFileName">INIファイル名
        /// <returns></returns>
public static string GetIniString(string lpSection, string lpKeyName, string lpFileName)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder(1024);

uint sLen = GetPrivateProfileString(lpSection, lpKeyName, "", sb, (uint)sb.Capacity, lpFileName);

return sb.ToString();
}

//*******************************************
// GetPrivateProfileInt
//
//*******************************************

///

<summary>
        ///
/// </summary>        /// <param name="lpSection">
        /// <param name="lpKeyName">
        /// <param name="lpFileName">
        /// <returns></returns>
public static uint GetIniValue(string lpSection, string lpKeyName, string lpFileName)
{
// 整数値を読み出す
uint resultValue= GetPrivateProfileInt(lpSection, lpKeyName, 0, lpFileName);

return resultValue;
}

//*******************************************
// WritePrivateProfileString
//
//*******************************************

///

<summary>
        /// INIファイルに値を書き込む
/// </summary>        /// <param name="lpSection">セッション名称
        /// <param name="lpKeyName">キー名称
        /// <param name="lpValue">セットする値
        /// <param name="lpFileName">INIファイル名
        /// <returns></returns>
public static bool SetIniString(string lpSection, string lpKeyName, string lpValue, string lpFileName)
{
long result = WritePrivateProfileString(lpSection, lpKeyName, lpValue, lpFileName);
return result != 0;
}

///

<summary>
        ///
/// </summary>        /// <param name="lpSection">
        /// <param name="lpKeyName">
        /// <param name="lpFileName">
        public static void DelKeyAndData_pair(string lpSection, string lpKeyName, string lpFileName)
{
// 1つのキーと値のペアを削除する
WritePrivateProfileString(lpSection, lpKeyName, null, lpFileName);
}

///

<summary>
        ///
/// </summary>        /// <param name="lpSection">
        /// <param name="lpFileName">
        public static void DelKeyAndData_all(string lpSection, string lpFileName)
{
// 指定セクション内の全てのキーと値のペアを削除する
WritePrivateProfileString(lpSection, null, null, lpFileName);
}

//*******************************************
// GetPrivateProfileStringByByteArray
//
//*******************************************

///

<summary>
        /// キーリスト
/// </summary>        /// <param name="lpSection">
        /// <param name="lpFileName">
        /// <returns></returns>
public static string[] GetKeys(string lpSection, string lpFileName)
{

byte[] ar1 = new byte[1024];
uint resultSize1= GetPrivateProfileStringByByteArray(lpSection, null, "", ar1,(uint)ar1.Length, lpFileName);
string result1 = Encoding.Default.GetString(ar1, 0, (int)resultSize1 - 1);
string[] keys = result1.Split('\0');
return keys;

}

///

<summary>
        /// セクションの一覧
/// </summary>        /// <param name="lpFileName">
        /// <returns></returns>
public static string[] GeSections(string lpFileName)
{
// 指定ファイルのセクションの一覧を得る
byte[] ar2 = new byte[1024];
uint resultSize2 = GetPrivateProfileStringByByteArray(null, null, "", ar2, (uint)ar2.Length, lpFileName);
string result2 = System.Text.Encoding.Default.GetString(ar2, 0, (int)resultSize2 - 1);
string[] sections = result2.Split('\0');
return sections;
}
}
}

-------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INI.IniFiles
{
class IniProc
{
public static void Proc()
{
string FilePath = @"C:\MyFile.ini";

//string s = IniFiles.GetIniString("Section1", "KEY1", FilePath);
IniFiles.SetIniString("Section1", "KEY1", "AAAA", FilePath);
IniFiles.SetIniString("Section1", "KEY2", "BBBB", FilePath);
IniFiles.SetIniString("Section1", "KEY3", "1", FilePath);
IniFiles.SetIniString("Section2", "KEY2", "AAAA", FilePath);
IniFiles.SetIniString("Section3", "KEY3", "AAAA", FilePath);

//-----------------------
// 文字列を読み出す
//-----------------------
StringBuilder sb = new StringBuilder(1024);
string sSection = "Section1";
string sKey = "KEY1";

string sRes = IniFiles.GetIniString(sSection, sKey, FilePath);

Console.WriteLine("{0}に含まれる{1}の数値: {2}", sSection,sKey, sRes);

//-----------------------
// 数値を読み出す
//-----------------------
sSection = "Section1";
sKey = "KEY3";

uint uiRes = IniFiles.GetIniValue(sSection, sKey, FilePath);
Console.WriteLine("{0}に含まれる{1}の値: {2}", sSection, sKey, uiRes);

//-----------------------
// Sectionリスト
//-----------------------
string[] sections = IniFiles.GeSections(FilePath);
foreach (string section in sections)
{
Console.WriteLine("このファイルに含まれるセクション名: {0}", section);
}
Console.WriteLine("");

//-----------------------
// keyリスト
//-----------------------
sSection = "Section1";
string[] keys = IniFiles.GetKeys(sSection, FilePath);
foreach (string key in keys)
{
Console.WriteLine(
"{0}セクションに含まれるキー名: {1}", sSection,key);
}
Console.WriteLine("");

}
}
}