【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() ); } 
    } 
}