INI形式のファイルを読み込み、読み込んだセクション・キー・値を一覧にして表示する例。 ここで紹介する実装では、INI形式の解析に正規表現を使う。 また、'#' および ';' で始まる行、および各行の ';' 以降をコメントとして扱う。
INI形式のファイルを読む
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
const string iniFile = @"test.ini";
// INIファイルを読み込み、各セクション毎に表示する
foreach (var section in ReadIni(iniFile)) {
Console.WriteLine("[{0}]", section.Key);
foreach (var pair in section.Value) {
Console.WriteLine(" <{0}>='{1}'", pair.Key, pair.Value);
}
}
}
private static Dictionary<string, Dictionary<string, string>> ReadIni(string file)
{
using (var reader = new StreamReader(file)) {
var sections = new Dictionary<string, Dictionary<string, string>>(StringComparer.Ordinal);
var regexSection = new Regex(@"^\s*\[(?<section>[^\]]+)\].*$", RegexOptions.Singleline | RegexOptions.CultureInvariant);
var regexNameValue = new Regex(@"^\s*(?<name>[^=]+)=(?<value>.*?)(\s+;(?<comment>.*))?$", RegexOptions.Singleline | RegexOptions.CultureInvariant);
var currentSection = string.Empty;
// セクション名が明示されていない先頭部分のセクション名を""として扱う
sections[string.Empty] = new Dictionary<string, string>();
for (;;) {
var line = reader.ReadLine();
if (line == null)
break;
// 空行は読み飛ばす
if (line.Length == 0)
continue;
// コメント行は読み飛ばす
if (line.StartsWith(";", StringComparison.Ordinal))
continue;
else if (line.StartsWith("#", StringComparison.Ordinal))
continue;
var matchNameValue = regexNameValue.Match(line);
if (matchNameValue.Success) {
// name=valueの行
sections[currentSection][matchNameValue.Groups["name"].Value.Trim()] = matchNameValue.Groups["value"].Value.Trim();
continue;
}
var matchSection = regexSection.Match(line);
if (matchSection.Success) {
// [section]の行
currentSection = matchSection.Groups["section"].Value;
if (!sections.ContainsKey(currentSection))
sections[currentSection] = new Dictionary<string, string>();
continue;
}
}
return sections;
}
}
}
例としてこのようなiniファイルの場合、
sample.ini
#
# ini file
#
; default section
username=test ; comment
password=xxxx ; comment
; setting for screen
[screen]
screenmode = fullscreen
screensize = 640x480
refresh-rate = 60Hz
; setting for input
[input]
shot=0
bomb = 1
skip=2
cancel = 3 ;
[screen]
screensize = 800x600
次のような実行結果となる。
実行結果
[] <username>='test' <password>='xxxx' [screen] <screenmode>='fullscreen' <screensize>='800x600' <refresh-rate>='60Hz' [input] <shot>='0' <bomb>='1' <skip>='2' <cancel>='3'