Web検索はbingがおすすめ!

ini ファイルから値を読み込む - C#

ini ファイルから値を読み込むコードを紹介します。

概要

新しいアプリでは、iniファイルを扱うことはほとんどありませんが、古いアプリとの互換性を保つためにiniファイルから値を読み込む操作が必要な場合があります。C#のライブラリにはiniファイルを操作するものは無いため、Windows APIを利用してiniファイルを操作します。iniファイルから値を読み込む場合は、GetPrivateProfileString() 関数を利用します。
メモ
iniファイルに値を書き込むコードはこちらの記事を参照してください。

プログラム

事前準備:iniファイルの作成

iniファイルを作成します。iniファイルはShift-JIS形式で記述します。 iniファイル自体がWindows 3.1の頃に使われている仕組みのため、UnicodeやUTF-8形式でエンコーディングされたファイルは正しく読み込めないため注意して下さい。 Visual Studioでエンコーディングを指定してテキスト形式のファイルを保存する手順はこちらの記事を参照してください。
今回は下記のiniファイルを作成します。
[Data]
Name=Penguin
ID=12



Visual Studioのソリューションエクスプローラに配置した場合は、iniファイルが出力ディレクトリに常にコピーされるようファイルのプロパティを設定します。

UI

下図のUIを作成します。ウィンドウにボタンと複数行のテキストボックスを配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace IniFileReadDemo
{
  public partial class FormMain : Form
  {
    [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileStringW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);

    public FormMain()
    {
      InitializeComponent();
    }

    private void Button1_Click(object sender, EventArgs e)
    {
      int capacitySize = 256;

      StringBuilder sb = new StringBuilder(capacitySize);
      uint ret = GetPrivateProfileString("Data", "Name", "none", sb, Convert.ToUInt32(sb.Capacity), ".\\file.ini");
      if (0 < ret){
        textBox1.Text += "Name:" + sb.ToString() + "\r\n";
      }

      sb = new StringBuilder(capacitySize);
      ret = GetPrivateProfileString("Data", "ID", "none", sb, Convert.ToUInt32(sb.Capacity), ".\\file.ini");
      if (0 < ret) {
        textBox1.Text += "ID:"  +sb.ToString() + "\r\n";
      }
    }
  }
}

解説

DllImportを利用するために、System.Runtime.InteropServicesをusingに追加します。
using System.Runtime.InteropServices;

下記のコードが、GetPrivateProfileString() のWindows APIをインポートするためのコードです。
    [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileStringW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);

ボタンのクリックにより下記のコードを実行します。
GetPrivateProfileString() Windows API関数を呼びだします。第一引数には読み出すiniファイルのセクション名、第二引数にはキー名、第三引数は読み込みができなかった場合のデフォルト値、第四引数に読み込み情報を返すStringBuilder 第五引数にStringBuilderのサイズ、第六引数にiniファイルのファイル名を与えます。下記のコードでは、"Data"セクションの "Name" キーの値を読み出します。
StringBuilderに読み込んだ値をテキストボックスに表示します。
      int capacitySize = 256;

      StringBuilder sb = new StringBuilder(capacitySize);
      uint ret = GetPrivateProfileString("Data", "Name", "none", sb, Convert.ToUInt32(sb.Capacity), ".\\file.ini");
      if (0 < ret){
        textBox1.Text += "Name:" + sb.ToString() + "\r\n";
      }

同様に、GetPrivateProfileString() 関数を呼び出し"Data"セクションの "ID" キーの値を読み出します。StringBuilderに読み込んだ値をテキストボックスに表示します。
      sb = new StringBuilder(capacitySize);
      ret = GetPrivateProfileString("Data", "ID", "none", sb, Convert.ToUInt32(sb.Capacity), ".\\file.ini");
      if (0 < ret) {
        textBox1.Text += "ID:"  +sb.ToString() + "\r\n";
      }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。下図の結果が表示されます。iniファイルに記載された値が取得できていることが確認できます。

補足

iniファイルのパスは実行ファイルと同じ位置にある場合は ".\\" を先頭に記述し相対パスで記述する方法もありますが、下記のように AppDomain.CurrentDomain.BaseDirectory を利用する記述法でも動作します。
      uint ret = GetPrivateProfileString("Data", "Name", "none", sb, Convert.ToUInt32(sb.Capacity), AppDomain.CurrentDomain.BaseDirectory + "file.ini");
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2019-08-17
iPentec all rights reserverd.