【Windows】ini設定ファイルをC#から扱ってみる。
CSharp小言
C#から設定ファイルを触りたかったがxmlがあまり好きではなかったためiniファイルに行きついた。
参考
GetPrivateProfileString 関数 (winbase.h) – Win32 apps | Microsoft Learn
ファイル構成
同じ階層にtest.csとload.iniを入れた。
├─ test.cs
└─ load.ini
サンプルiniファイル
#shift-jis check:あいうえお
[GhostMenuName]
Sakura =ONE
Kero =さとうささら
[SectionName]
YourKey = YourValue
YourKeyInt = 9
セクション一覧を取得する。
using System;
using System.Text;
//dllinport
using System.Runtime.InteropServices;
class Program {
//Sections
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileSectionNames")]
static extern int GetPrivateProfileSectionNames( IntPtr SectionsPointer, uint nSize, string FilePath);
static void Main(string[] args) {
string file = "./load.ini";
//指定したファイルのセクション一覧を抜く。
//セクション数が膨大になればメモリ確保に気を使う必要がある。
IntPtr SectionsPointer = Marshal.StringToHGlobalAnsi(new String('\0', 1024));
//セクション名一覧。null文字区切り。
int length = GetPrivateProfileSectionNames(SectionsPointer, 1024, file);
if (0 < length) {
String result = Marshal.PtrToStringAnsi(SectionsPointer, length);
string[] x = result.Split('\0');
foreach( string line in x ) {
Console.WriteLine( line );
}
}
Marshal.FreeHGlobal(SectionsPointer);
}
}
keyからvalueをintで取得する。
using System;
using System.Text;
//dllinport
using System.Runtime.InteropServices;
class Program {
//Key = Int
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileInt")]
static extern int GetPrivateProfileInt( string String, string Key, int Default, string FilePath);
static void Main(string[] args) {
string file = "./load.ini";
//指定したセクションのint keyを抜く
int DefaultInt = 0;
int resInt = GetPrivateProfileInt("SectionName", "YourKeyInt", DefaultInt, file );
Console.WriteLine( resInt );
}
}
keyからvalueをstringで取得する。
using System;
using System.Text;
//dllinport
using System.Runtime.InteropServices;
class Program {
//Key = String
[DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileString")]
static extern uint GetPrivateProfileString(string Section, string Key, string Default, StringBuilder Value, uint ValueSize, string FilePath );
static void Main(string[] args) {
string file = "./load.ini";
//指定したセクションのstring keyを抜く
//メモリと文字数に注意すること。
int StringSize = 256;
StringBuilder sb = new StringBuilder(StringSize);
uint resSize = GetPrivateProfileString("SectionName", "YourKey", "IfNone", sb, Convert.ToUInt32(sb.Capacity), file );
if (0 < resSize){ Console.WriteLine( sb.ToString() ); }
}
}