📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の4版が非表示) | |||
| 296行目: | 296行目: | ||
シンプルな設定ファイルから複雑な構成ファイルまで、幅広いシナリオでini-parserライブラリは有効なライブラリとなっている。<br> | シンプルな設定ファイルから複雑な構成ファイルまで、幅広いシナリオでini-parserライブラリは有効なライブラリとなっている。<br> | ||
<br> | <br> | ||
<u>ini-parserライブラリは、MITライセンスに準拠している。</u><br> | |||
<br> | |||
==== ini-parserライブラリのインストール ==== | ==== ini-parserライブラリのインストール ==== | ||
RiderまたはVisual StudioからNuGetを使用して、ini-parserライブラリをインストールする。<br> | RiderまたはVisual StudioからNuGetを使用して、ini-parserライブラリをインストールする。<br> | ||
| 344行目: | 347行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
また、大きなサイズなINIファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br> | |||
<br> | <br> | ||
==== INIファイルの読み込み ==== | ==== INIファイルの読み込み ==== | ||
以下の例では、ini-parserライブラリを使用して、INIファイルを非同期で読み込みしている。<br> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Threading.Tasks; | |||
using IniParser; | |||
using IniParser.Model; | |||
public class IniParserReader | |||
{ | |||
private readonly FileIniDataParser _parser; | |||
private IniData _iniData; | |||
public IniParserReader() | |||
{ | |||
_parser = new FileIniDataParser(); | |||
} | |||
// INIファイルを非同期で読み込む | |||
public async Task ReadIniFileAsync(string filePath) | |||
{ | |||
try | |||
{ | |||
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) | |||
using (var streamReader = new StreamReader(fileStream)) | |||
{ | |||
var fileContent = await streamReader.ReadToEndAsync(); | |||
_iniData = _parser.Parser.Parse(fileContent); | |||
} | |||
Console.WriteLine("INIファイルの読み込みが完了"); | |||
} | |||
catch (FileNotFoundException) | |||
{ | |||
Console.WriteLine("指定されたファイルが存在しない"); | |||
} | |||
catch (IOException ex) | |||
{ | |||
Console.WriteLine($"ファイルの読み込み中にエラーが発生: {ex.Message}"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"予期せぬエラーが発生: {ex.Message}"); | |||
} | |||
} | |||
// 値を取得するメソッド | |||
public string GetValue(string section, string key) | |||
{ | |||
return _iniData?[section]?[key]; | |||
} | |||
// 読み込んだINIファイルの内容を表示するメソッド | |||
public void DisplayContent() | |||
{ | |||
if (_iniData == null) | |||
{ | |||
Console.WriteLine("INIファイルが読み込まれていない"); | |||
return; | |||
} | |||
foreach (var section in _iniData.Sections) | |||
{ | |||
Console.WriteLine($"[{section.SectionName}]"); | |||
foreach (var key in section.Keys) | |||
{ | |||
Console.WriteLine($"{key.KeyName}={key.Value}"); | |||
} | |||
Console.WriteLine(); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
上記のクラスを使用する場合は、以下に示すようにインスタンスを生成して、メソッドを実行する。<br> | |||
<syntaxhighlight lang="c#"> | |||
var iniReader = new IniParserReader(); | |||
// INIファイルの読み込み | |||
await iniReader.ReadIniFileAsync("sample.ini"); | |||
// 値の取得 | |||
string value = iniReader.GetValue("セクション名", "キー名"); | |||
// 取得した値の表示 | |||
iniReader.DisplayContent(); | |||
</syntaxhighlight> | |||
<br> | |||
==== INIファイルの書き込み ==== | |||
以下の例では、INIファイルを非同期で書き込みするクラスを定義している。<br> | |||
<br> | <br> | ||
==== | <code>FileStream</code>クラスでは、下記の設定を行っている。<br> | ||
* 新しいファイルを作成 または 既存のファイルを上書き | |||
* 書き込み専用で開く | |||
* 他のプロセスからのアクセスを禁止 | |||
*: 他のプロセスとファイルを共有したい場合は、FileShare.Noneを変更する。 | |||
* 4[KB] = 4096[byte]のバッファを使用 | |||
*: 一般的に、4096[byte]はファイルI/Oに適したサイズとされている。 | |||
*: 大きすぎるとメモリを無駄に使い、小さすぎると頻繁なI/O操作が必要になる。 | |||
* 非同期に操作することを指定 | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.IO; | |||
using System.Threading.Tasks; | |||
using IniParser; | |||
using IniParser.Model; | |||
public class IniParserWriter | |||
{ | |||
private readonly FileIniDataParser _parser; | |||
private IniData _iniData; | |||
public IniParserWriter() | |||
{ | |||
_parser = new FileIniDataParser(); | |||
_iniData = new IniData(); | |||
} | |||
// INIファイルを非同期で書き込む | |||
public async Task WriteIniFileAsync(string filePath) | |||
{ | |||
try | |||
{ | |||
using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true)) | |||
using (var streamWriter = new StreamWriter(fileStream)) | |||
{ | |||
var content = _parser.Parser.WriteToString(_iniData); | |||
await streamWriter.WriteAsync(content); | |||
} | |||
Console.WriteLine("INIファイルの書き込みが完了"); | |||
} | |||
catch (UnauthorizedAccessException) | |||
{ | |||
Console.WriteLine("ファイルへの書き込み権限がない"); | |||
} | |||
catch (IOException ex) | |||
{ | |||
Console.WriteLine($"ファイルの書き込み中にエラーが発生: {ex.Message}"); | |||
} | |||
catch (Exception ex) | |||
{ | |||
Console.WriteLine($"予期せぬエラーが発生: {ex.Message}"); | |||
} | |||
} | |||
// 値を設定する | |||
public void SetValue(string section, string key, string value) | |||
{ | |||
_iniData[section][key] = value; | |||
} | |||
// セクションを追加する | |||
public void AddSection(string section) | |||
{ | |||
if (!_iniData.Sections.ContainsSection(section)) | |||
{ | |||
_iniData.Sections.AddSection(section); | |||
} | |||
} | |||
// セクションを削除する | |||
public void RemoveSection(string section) | |||
{ | |||
_iniData.Sections.RemoveSection(section); | |||
} | |||
// キーを削除する | |||
public void RemoveKey(string section, string key) | |||
{ | |||
_iniData[section].RemoveKey(key); | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
上記のクラスを使用する場合は、以下に示すようにインスタンスを生成して、メソッドを実行する。<br> | |||
<syntaxhighlight lang="c#"> | |||
var iniWriter = new IniParserWriter(); | |||
// セクションを追加する | |||
iniWriter.AddSection("新しいセクション"); | |||
// セクション, キー, 値をセット | |||
iniWriter.SetValue("新しいセクション", "新しいキー", "新しい値"); | |||
// INIファイルへ書き込む | |||
await iniWriter.WriteIniFileAsync("sample.ini"); | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||