C#でiniファイルの情報を取得する

By | 2011年8月19日

前回は、C#でiniファイルに記述されたセクション名の一覧を取得してみた。
せっかくなのでその情報も取得してみよう。まず、対象となるiniファイルを再掲する。

test.ini

[Bob]
Age=17
[John]
Age=6
[Mike]
Age=31
[Ken]
Age=35
[Alice]
Age=4

今回はAgeの部分を取得したい。そのためにはWindowsAPIのGetPrivateProfileString()関数を使う必要がある。
C#から呼び出すためのPInvoke宣言は以下のようになる。

        [DllImport("kernel32.dll")]
        static extern uint GetPrivateProfileString(
           string lpAppName,      // セクション名
           string lpKeyName,      // キー名
           string lpDefault,         // 規定の文字列 
           StringBuilder lpReturnedString,  // 情報が格納されるバッファ
           uint nSize,  // 情報バッファのサイズ
           string lpFileName  // .iniファイルの名前
        );

そして、プログラム全体は以下のようになった。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

namespace PInvokeLesson
{
    public partial class Form1 : Form
    {
        [DllImport("kernel32.dll")]
        static extern int GetPrivateProfileSectionNames(
            IntPtr lpszReturnBuffer,
            uint nSize,
            string lpFileName);

        [DllImport("kernel32.dll")]
        static extern uint GetPrivateProfileString(
           string lpAppName,
           string lpKeyName,
           string lpDefault,
           StringBuilder lpReturnedString,
           uint nSize,
           string lpFileName);

        public Form1()
        {
            InitializeComponent();
        }

        // Windowsフォーム アプリケーション
        // プロジェクト初期状態のフォームにボタンを一つ追加し、
        // そのクリックイベントハンドラからプログラムは開始する。
        private void button1_Click(object sender, EventArgs e)
        {
            String path = 
                Application.StartupPath +
                Path.DirectorySeparatorChar +
                "test.ini";

            if (File.Exists(path))
            {
                IntPtr ptr = Marshal.StringToHGlobalAnsi(new String('\0', 1024));
                int length = GetPrivateProfileSectionNames(ptr, 1024, path);

                if (0 < length)
                {
                    String result = Marshal.PtrToStringAnsi(ptr, length).TrimEnd(new char[] { '\0' });

                    Array.ForEach<String>(result.Split('\0'), s => {

                        StringBuilder sb = new StringBuilder(64);
                        
                        // iniファイルから情報を取得する
                        GetPrivateProfileString(s, "Age", "", sb, 64, path);

              // 取得した情報を表示
                        Console.WriteLine("Name:" + s + " Age:" + sb.ToString() ); 
                    });
                }

                Marshal.FreeHGlobal(ptr);
            }
        }
    }
}

プログラムの実行フォルダに、test.iniファイルがあることを確認し
実行すると以下のように表示される。

Name:Bob Age:17
Name:John Age:6
Name:Mike Age:31
Name:Ken Age:35
Name:Alice Age:4


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です