developer's diary

最近はc#のエントリが多いです

c# ( dotnetcore ) で Microsoft.Extensions.Configuration.Iniを利用して iniファイルを読み込む

The Art of UNIX Programming (アスキードワンゴ)の第5章にある、「テキスト形式 :優れたプロトコルが優れた実践を生む」> 「5.2データファイルメタフォーマツト」>「5.2.6 WindowsINIフォーマット」(P.151)をC#でも読み込みたい。

MacではWin32APIは使えない。

昔々、iniファイルの読み込みは、win32APIにある、「GetPrivateProfileString」を利用して読み込まれることが多かったようです。

しかしwin32APIは、macじゃ利用できない。

でどうするかを調べた。

Microsoft.Extensions.Configuration.Ini をインストール

NuGetでMicrosoft.Extensions.Configuration.Iniをインストールします。iniで検索したら出てきました。

f:id:mitsugi-bb:20200820053941p:plain
NuGet パッケージ管理をiniで検索

iniファイル作成

example.ini というファイル名でファイルを作成

;コメント
[section1]
name = "test1"

;コメント
[section2]
name = test2

出力ディレクトリにコピーするよう設定

プロジェクトにiniファイルを追加したので、出力ディレクトリにコピーをしておこう。

そうすれば、コンパイル結果にiniファイルも出力される

f:id:mitsugi-bb:20200820054604p:plain
出力ディレクトリにコピー

iniファイルを読み込むプログラム

using System;
using Microsoft.Extensions.Configuration;

namespace example_console_app
{
    class Program
    {
        static void Main(string[] args)
        {
            //iniファイルを読み込む
            var ini = new ConfigurationBuilder()
                .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                .AddIniFile("example.ini").Build();

            //iniファイルの内容を出力
            Console.WriteLine(ini["section1:name"]);
            Console.WriteLine(ini["section2:name"]);
        }
    }
}

出力結果

test1
test2

iniファイルがなかったらどうなるか

System.IO.FileNotFoundExceptionをthrowしました。

f:id:mitsugi-bb:20200820060225p:plain
FileNotFoundExceptionをThrowしている様子

try~catchを追記して内容を確認

using System;
using Microsoft.Extensions.Configuration;

namespace example_console_app
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //iniファイルを読み込む
                var ini = new ConfigurationBuilder()
                    .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                    .AddIniFile("example2.ini").Build();

                //iniファイルの内容を出力
                Console.WriteLine(ini["section1:name"]);
                Console.WriteLine(ini["section2:name"]);
            }
            catch (System.IO.FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

e.Messageの内容

The configuration file 'example2.ini' was not found and is not optional. The physical path is '/Users/mitsugi/Projects/example-console-app/example-console-app/bin/Debug/netcoreapp3.1/example2.ini'.

iniファイルが壊れていたらどうなるか

iniファイルを以下のように修正して確認(section2の閉じる]を消した)

;コメント
[section1]
name = "test1"

;コメント
[section2
name = test2

実行してみると、System.FormatExceptionをthrowしました。

f:id:mitsugi-bb:20200820060315p:plain
System.FormatExceptionをthrowしている様子

try~catchを追記して内容を確認

using System;
using Microsoft.Extensions.Configuration;

namespace example_console_app
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //iniファイルを読み込む
                var ini = new ConfigurationBuilder()
                    .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                    .AddIniFile("example.ini").Build();

                //iniファイルの内容を出力
                Console.WriteLine(ini["section1:name"]);
                Console.WriteLine(ini["section2:name"]);
            }
            catch (System.IO.FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
            }
            catch (System.FormatException e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

e.Messageの内容

Unrecognized line format: '[section2'.

参考書籍