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に未対応
実装は難しくないので改良してもらっても良いですし、上記の機能を満たしたクラスは他にもあるので必要なら他のライブラリを使った方が良いです。
こちらもおススメ