[C#]key-valueを保存する為のiniファイル管理クラスを作る(40行)

カテゴリ: C# | タグ:

C#のプログラムでシンプルなkey-value情報を保存するために、iniファイルsaver/loaderが必要だったため作成しました。

使い方

以下のように、Save/Loadメソッドで読み書きをします。データのやり取りはDictionaryで行います。

// 読み出し
var filename = "userinfo.ini";
var profile = TinyIniManager.Load( filename );  // Dictionary<string,string>が返る

// 保存
TinyIniManager.Save( "test.txt", profile );

プログラム

機能を絞っているので、コメント抜きで40行程度の小さなクラスです。
また、C#に慣れていない人でもわかりやすくするため、Linqなどは使用していません。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

class TinyIniManager {

    /// <summary>
    /// iniファイルを読み込む
    /// </summary>
    /// <param name="filename">ファイル名</param>
    /// <param name="encode">ファイルのエンコード</param>
    /// <returns></returns>
    public static Dictionary<string, string> Load( string filename, Encoding encode = null )
    {
        // ファイルのエンコードを決定する
        if ( encode == null) {
            encode = new UTF8Encoding( false );
        }

        var datas = new Dictionary<string, string>();

        var lines = File.ReadAllLines( filename, encode );
        foreach ( var line in lines ) {
            // keyとvalueの区切り目を見つける
            var pos = line.IndexOf( '=' );
            if ( pos < 0 ) {
                continue;
            }

            // key-valueを一覧に追加
            var key = line.Substring( 0, pos );
            var val = line.Substring( pos + 1 );
            datas[key] = val;
        }

        // 追加された一覧を返す
        return datas;
    }


    /// <summary>
    /// iniファイルに保存する
    /// </summary>
    /// <param name="filename">ファイル名</param>
    /// <param name="datas">保存するデータ</param>
    /// <param name="encode">ファイルのエンコード</param>
    public static void Save( string filename, Dictionary<string, string> datas, Encoding encode = null ) 
    {
        // ファイルのエンコードを決定する
        if ( encode == null ) {
            encode = new UTF8Encoding( false );
        }

        using ( StreamWriter writer = new StreamWriter( filename, false, encode ) ) {

            foreach ( string key in datas.Keys ) {
                // keyに"="が入っていたら例外を投げる
                if ( key.IndexOf( "=" ) > 0 ) {
                    throw new ArgumentException( @"invalid key[{key}]" );
                }

                var value = datas[key];
                writer.WriteLine( key + "=" + value );
            }
        }
    }
}

対応しない機能

本当にシンプルにしたかった為、iniファイルにありがちな下記の機能はあえて実装していません。

  • 行頭の#によるコメントに未対応
  • [xxx]でのカテゴリ分けに未対応
  • 複数行のValueに未対応

実装は難しくないので改良してもらっても良いですし、上記の機能を満たしたクラスは他にもあるので必要なら他のライブラリを使った方が良いです。


Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

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