📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の5版が非表示)
251行目: 251行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
上記のクラスを使用する場合は、以下に示すようにインスタンスを生成して、メソッドを実行する。<br>
<syntaxhighlight lang="c#">
var iniWriter = new IniFileWriter();
// セクションを追加する
iniWriter.AddSection("新しいセクション");
// セクション, キー, 値をセット
iniWriter.SetValue("新しいセクション", "新しいキー", "新しい値");
// INIファイルへ書き込む
await iniWriter.WriteIniFileAsync("sample.ini");
</syntaxhighlight>
<br><br>


== ini-parserライブラリ ==
==== ini-parserライブラリとは ====
ini-parserライブラリは、C#で開発されたオープンソースのライブラリであり、INIファイルの読み書きを簡単に行うことができる。<br>
このライブラリは、INIファイルの構造を解析して、扱いやすいオブジェクトモデルに変換する機能を提供している。<br>
<br>
ini-parserライブラリの主な特徴として、シンプルで直感的なAPIを持つことが挙げられる。<br>
開発者は、複雑な文字列操作やファイル操作を行うことなく、INIファイルの内容を簡単に操作することができる。<br>
<br>
このライブラリは、セクション、キー、値の概念を自然にサポートしており、INIファイルの階層構造を忠実に表現する。<br>
<br>
ライブラリの中心となるのは、<code>FileIniDataParser</code>クラスである。<br>
このクラスを使用することにより、INIファイルの読み込みと書き込みを行うことができる。<br>
<br>
読み込んだデータは<code>IniData</code>オブジェクトとして表現され、このオブジェクトを通じてINIファイルの内容にアクセスおよび変更することが可能である。<br>
<br>
ini-parserライブラリは、コメントの保持やフォーマットの維持等、INIファイルの構造を尊重する機能も備えている。<br>
これにより、既存のINIファイルを読み込んで変更を加え、元のフォーマットを保ったまま書き出すことができる。<br>
<br>
エラーハンドリングも考慮されており、ファイルの読み込みや書き込み時に発生する可能性のある例外を適切に処理できるようになっている。<br>
また、無効なINIファイルの構造に対しても、可能な限り柔軟に対応するよう設計されている。<br>
<br>
パフォーマンスの面でも、ini-parserライブラリは効率的に動作するよう最適化されている。<br>
大きなINIファイルを扱う場合でも、メモリ使用量を抑えつつ高速に処理を行うことができる。<br>
<br>
さらに、ini-parserライブラリは拡張性も考慮されており、カスタムのパーサーや書き込みロジックを実装することも可能である。<br>
これにより、特殊なフォーマットのINIファイルや、INIファイルに似た独自フォーマットのファイルにも対応することができる。<br>
<br>
ini-parserライブラリを使用することにより、開発者はINIファイルの処理に関する低レベルの詳細に煩わされることなく、アプリケーションのロジックに集中することができる。<br>
シンプルな設定ファイルから複雑な構成ファイルまで、幅広いシナリオでini-parserライブラリは有効なライブラリとなっている。<br>
<br>
<u>ini-parserライブラリは、MITライセンスに準拠している。</u><br>
<br>
==== ini-parserライブラリのインストール ====
RiderまたはVisual StudioからNuGetを使用して、ini-parserライブラリをインストールする。<br>
* Riderの場合
*# プロジェクトを開く。
*# [ツール]メインメニュー - [Nuget] - [ソリューション の Nuget パッケージを管理] (または、[<プロジェクト名> の Nuget パッケージを管理])を選択する。
*# メイン画面下部にある[パッケージ]タブから <u>ini-parser</u> と入力して検索する。
*# メイン画面下部の右にある[+]ボタンを押下して、ini-parserライブラリをインストールする。
*: <br>
* Visual Studioの場合
*# プロジェクトを開く。
*# NuGetパッケージマネージャーを開く。
*#* [ツール]メインメニュー - [NuGetパッケージマネージャー]を選択して、[ソリューションのNuGetパッケージの管理]を選択する。
*#* または、ソリューションエクスプローラーでプロジェクトを右クリックして、コンテキストメニューから[NuGetパッケージの管理]を選択する。
*# ini-parserライブラリを検索する。
*#: NuGetパッケージマネージャーの検索ボックスに <u>ini-parser</u> と入力して検索する。
*# ini-parserライブラリのインストール
*#: 検索結果からini-parserライブラリを選択して、[インストール]ボタンを押下する。
*# インストールの確認ダイアログが表示されるので、[OK]ボタンを押下してインストールを完了する。
*# 参照の確認
*#: インストールが完了した後、プロジェクトの参照にini-parserライブラリが追加されていることを確認する。
*: <br>
* パッケージマネージャーコンソールからインストールする場合
*# プロジェクトを開く。
*# [表示]メインメニュー - [その他のウィンドウ] - [パッケージマネージャーコンソール]を選択して、パッケージマネージャーコンソールを開く。
*# パッケージマネージャーコンソールから、ini-parserライブラリをダウンロードしてインストールする。
*#: <code>Install-Package ini-parser</code>
*# ソリューションエクスプローラーのプロジェクトの参照において、ini-parserライブラリが追加されていることを確認する。
*: <br>
* <code>dotnet</code>コマンドを使用する場合
*# ターミナルを開く。
*# プロジェクトのルートディレクトリに移動する。
*# ini-parserライブラリをインストールする。
*#: 最新の安定版をインストールする場合
*#: <code>dotnet add package ini-parser</code>
*#: <br>
*#: バージョンを指定してインストールする場合
*#: <code>dotnet add package ini-parser --version <バージョン></code>
*#: <br>
*: <u>※注意</u>
*: <u>プロジェクトがGit等のバージョン管理システムを使用している場合、これらの変更がトラッキングされることを確認すること。</u>
*: <u>プロジェクトを再ビルドして、新しく追加されたパッケージが正しく統合されていることを確認することを推奨する。</u>
<br>
プロジェクトにおいて、ini-parserライブラリを使用する場合は、ソースコードファイルの先頭にusingステートメントを追加する。<br>
<syntaxhighlight lang="c#">
using IniParser;
using IniParser.Model;
</syntaxhighlight>
<br>
また、大きなサイズなINIファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
<br>
==== 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>
<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>