最近シノアリスをはまってないけど頑張ってます
正直色々ガバガバでこのゲーム大丈夫か?って思いながらプレイしてます。
今日は設定ファイルの読み込みについて書こうと思います(自分のための覚え書きです)
結論から言うと正規表現を使おうってことです。
でも、正規表現の説明をしているサイトなんて無限にあるので雑にこんなこと出来るよくらいで書いてみます。
プログラムを書いていると設定ファイルを使うことが多々ありますが自分でフォーマット決めてかけるようにするとき順不同にするために
設定項目名1:値1
設定項目名2:値2
的な仕様にしていて、今までは読み込むときに
var sr = new StreamReader("[パス]");
string line = "";
while(!sr.EndOfStream){
line=sr.ReadLine();
if(line.contains("[設定項目名1]")){
//処理
}else if(line.contains("[設定項目名2]")){
//処理
}
}
見たいに書いてました。
この方法だと設定項目名と同じ値は必ず使えないという縛りがありました。
他にも値を取り出すときに
line.Split(':');
で取りだしていたのですが値に':'があると分解されるという問題もありました。
(これに関しては取り出し方を変えればいいだけですが)
より見やすく簡単にするために正規表現を使ってみます
var sr = new StreamReader("[パス]");
var lines = "";
while(!sr.EndOfStream)lines+=sr.ReadLine();
Regex r = new Regex("[設定項目名1].*\n",RegexOptions.Singleline);
Match m = r.Match(lines);
if(m.success){
//処理(m.Valueで対象の値が使える)
}
r=new Regex("[設定項目名2].*\n");
Match m = r.Match(lines);
if(m.success){
//処理(m.Valueで対象の値が使える)
}
といった感じになるかなと思います。
正規表現についての詳しい解説は他のサイトがいくつも行っているので省略します。
"folder"で指定されたフォルダ内の画像のリスト(例としてjpg,bmp,png)が欲しければ下のような感じになるかと思います。
設定ファイル(setting.txt)
//folderはいくつも指定可能
folder:C:\Picture
folder:C:\Photo
using System;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
class Example{
static void Main(string[] args){
StreamReader sr = new StreamReader("./setting.txt");//設定ファイルがプログラムと同位置にあるという過程
string line = "", all_lines = "";
while(!sr.EndOfStream){
line = sr.ReadLine();
//設定ファイルでコメントアウトを使う場合
if(line.Substring(0,2).Equals("//"))continue;
all_lines += line+"\n";
}
//正規表現のパターンと改行で切って比較するかどうかの設定
Regex r = new Regex("folder:.+",RegexOptions.Multiline);
//folder:で始まる行のみを抽出してmatchesに格納
var matches = r.Matches(all_lines);
foreach (var value in matches)
{
//フォルダ内のファイルリスト取得
var folder = Directory.GetFiles(value.ToString().Replace("folder:", "").Replace("\n", ""));
//jpg,png,bmp拡張子のみを抽出
var files = folder.Where(x => x.Contains(".jpg") || x.Contains(".png") || x.Contains(".bmp"));
//コンソールに表示
foreach (var a in files) Console.WriteLine(a);
}
}
}
実行結果

上の抽象的な例では設定項目が1つ以下であるという体で書いていたのでMatchを利用し、successで該当部分があったかどうかを判別しました。
下の例ではfolderが2つ3つ指定されている可能性があるためMatchesメソッドで該当部分を全て挙げました。
そのため、少しソースが変わっています。
正規表現は便利なのでもっと使っていきたい