2016年09月21日

c#で.conf読みたい。

xubuntuでmonoをぼちぼちと使い始めたのだが、Winといろいろ勝手が違うので自分で触りやすいように道具の準備からはじめることにしてみた。Win7環境で簡単なアプリを作るのには主にVS2013EEでのC#かLazarus(どっちもポトリペタリで楽www)なのだが、xubuntuでもそういう感じでやろうかと。



ひとまず自分のアプリ作るに先立って.confが読めるようになにかいい物がないかと探そうとも思ったのだが、読みこむだけなら大して大変でもないだろうからとりあえずやってみた。別に正規表現使わなくてもいいとは思ったのだがwパースするのにこの方が楽っぽかったので。
基本セクションの設定がない場合「cur」という辞書に全部放り込むようになっている。
クラスを実体化してRead()すれば全部stringで読み込まれるので、数値は適当にConvert.ToInt32とかで変換して使えばよろしかろうということで。


ConfFiles.cs

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

namespace ConfigSystem
{
public class ConfFile : Dictionary<string, Dictionary<string, string>>
{
private string Path { get; set; }
public ConfFile()
{
}
public ConfFile (string path)
{
Path = path;
}
public bool Read()
{
if (!File.Exists (Path)) return false;
Regex rgxSection =
new Regex (@"^\[(?<section>[^]]+)\]",RegexOptions.Compiled);
Regex rgxKeyValues =
new Regex (@"(?<key>(\w|\s)+)\s?=\s?(?<value>.+)$",RegexOptions.Compiled);
this["cur"] = new Dictionary<string, string> ();
Dictionary<string, string> cur = this ["cur"];
using (StreamReader sr = new StreamReader (Path)) {
while (!sr.EndOfStream) {
string line = sr.ReadLine ().Trim();
if (line.Length < 1) continue;
Char c = line [0];
if (c == '#' || c == ';') continue; // comment
if (rgxSection.IsMatch (line)) {
Match match = rgxSection.Match (line);
string sectionName = match.Groups ["section"].Value.Trim();
if (!this.ContainsKey (sectionName)) {
this [sectionName] = new Dictionary<string, string> ();
}
cur = this [sectionName];
} else if (rgxKeyValues.IsMatch (line)) {
Match match = rgxKeyValues.Match (line);
string key = match.Groups ["key"].Value.Trim();
string value = match.Groups ["value"].Value.Trim();
cur [key] = value;
}
}
}
return true;
}
}
}
}
タグ:develop
posted by MCI_Error at 11:00| Comment(0) | c# mono
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: