📢 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>
また、大規模なCSVファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<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>
==== INIファイルの書き込み ====
<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>