「C Sharpの基礎 - TOML」の版間の差分

ナビゲーションに移動 検索に移動
385行目: 385行目:
           }
           }
       });
       });
    }
}
</syntaxhighlight>
<br>
==== TOMLファイルの書き込み ====
以下の例では、Tomlynライブラリを使用して、指定されたTOMLファイルを生成している。<br>
<br>
* ストリーミング処理
*: WriteTomlConfigAsyncメソッド内でFileStreamを使用して、効率的に書き込んでいる。
*: また、useAsyncプロパティにtrueを指定することにより、非同期I/O操作を有効にしている。
* TOMLファイルの生成
*: CreateTomlConfigメソッドで、指定された構造のTOML設定をTomlTableオブジェクトとして作成している。
*: Toml.FromModelメソッドを使用して、TomlTableオブジェクトをTOML文字列に変換している。
* ファイルへの書き込み
*: WriteTomlConfigAsyncメソッド内で、生成されたTOML文字列をファイルに非同期で書き込んでいる。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;
using Tomlyn;
using Tomlyn.Model;
class Program
{
    static async Task Main(string[] args)
    {
      string filePath = "config.toml";  // 書き込むTOMLファイルのパス
      try
      {
          // TOML設定を作成
          var config = CreateTomlConfig();
          // 設定をTOMLファイルに非同期で書き込み
          await WriteTomlConfigAsync(config, filePath);
      }
      catch (Exception ex)
      {
          Console.WriteLine($"エラーが発生: {ex.Message}");
      }
    }
    // TOML設定を作成
    static TomlTable CreateTomlConfig()
    {
      var config = new TomlTable
      {
          ["title"] = "設定ファイル",
          ["user"] = new TomlTable
          {
            ["name"] = "山田太郎",
            ["age"] = 30,
            ["email"] = "yamada@example.com"
          },
          ["application"] = new TomlTable
          {
            ["version"] = "1.0.0",
            ["debug_mode"] = false
          },
          ["database"] = new TomlTable
          {
            ["host"] = "localhost",
            ["port"] = 5432,
            ["username"] = "admin",
            ["password"] = "secret"
          },
          ["features"] = new TomlTable
          {
            ["enabled"] = new List<string> { "login", "logout", "dashboard" },
            ["disabled"] = new List<string> { "admin_panel" }
          },
          ["logging"] = new TomlTable
          {
            ["level"] = "info",
            ["file"] = "/var/log/app.log"
          },
          ["servers"] = new List<TomlTable>
          {
            new TomlTable { ["ip"] = "192.168.1.1", ["role"] = "frontend" },
            new TomlTable { ["ip"] = "192.168.1.2", ["role"] = "backend" }
          }
      };
      return config;
    }
    // TOML設定をファイルに非同期で書き込む
    static async Task WriteTomlConfigAsync(TomlTable config, string filePath)
    {
      // TomlTableをTOML文字列に変換
      string tomlString = Toml.FromModel(config);
      // ファイルを非同期で書き込む
      using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
      using (var writer = new StreamWriter(stream))
      {
          await writer.WriteAsync(tomlString);
      }
    }
}
</syntaxhighlight>
<br>
==== TOMLファイルの修正 ====
以下の例では、Tomlynライブラリを使用して、以下に示すTOMLファイルの値を修正している。<br>
<br>
* ストリーミング処理
*: ReadTomlConfigAsyncおよびWriteTomlConfigAsyncメソッド内でFileStreamを使用して、効率的に読み書きしている。
*: また、useAsyncプロパティの値をtrueを指定することにより、非同期I/O操作を有効にしている。
* TOMLファイルの更新
*: UpdateConfigメソッドで、指定された変更を行っている。
*:* [application]セクション -> "version"キーの値を"1.1.0"に変更する。
*:* [logging]セクション -> "level"キーそのものを削除する。
*:* [features]セクション -> "enabled"キーの配列から"logout"を削除する。
*:* 2つ目の<nowiki>[[servers]]</nowiki>配列 -> "ip"キーの値を"192.168.1.10"に変更する。
* ファイルへの書き込み
*: WriteTomlConfigAsyncメソッド内で、更新されたTOMLデータをファイルに非同期で書き込んでいる。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Tomlyn;
using Tomlyn.Model;
class Program
{
    static async Task Main(string[] args)
    {
      string filePath = "config.toml";  // 修正するTOMLファイルのパス
      try
      {
          // TOMLファイルを非同期で読み込み・解析
          var config = await ReadTomlConfigAsync(filePath);
          // ファイルを修正
          UpdateConfig(config);
          // 修正したデータをTOMLファイルに非同期で書き込む
          await WriteTomlConfigAsync(config, filePath);
      }
      catch (FileNotFoundException)
      {
          Console.WriteLine($"エラー: ファイル '{filePath}' が存在しない");
      }
      catch (UnauthorizedAccessException)
      {
          Console.WriteLine($"エラー: ファイル '{filePath}' にアクセスする権限がない");
      }
      catch (TomlParseException ex)
      {
          Console.WriteLine($"エラー: TOMLファイルの解析に失敗: {ex.Message}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
    // TOMLファイルを非同期で読み込む
    static async Task<TomlTable> ReadTomlConfigAsync(string filePath)
    {
      using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true))
      using (var reader = new StreamReader(stream))
      {
          string tomlContent = await reader.ReadToEndAsync();
          return Toml.ToModel(tomlContent);
      }
    }
    // データを修正する
    static void UpdateConfig(TomlTable config)
    {
      // [application]セクション -> "version"キーを"1.1.0"に変更
      ((TomlTable)config["application"])["version"] = "1.1.0";
      // [features]セクション -> "enabled"キー (配列) から"logout"を削除
      var enabledFeatures = (List<object>)((TomlTable)config["features"])["enabled"];
      enabledFeatures.Remove("logout");
      // 2つ目の[[servers]]配列 -> "ip"セクションを"192.168.1.10"に変更
      var servers = (List<object>)config["servers"];
      if (servers.Count >= 2)
      {
          ((TomlTable)servers[1])["ip"] = "192.168.1.10";
      }
      // [logging]セクション -> "level"キーを削除
      ((TomlTable)config["logging"]).Remove("level");
    }
    // 更新された設定をTOMLファイルに非同期で書き込む
    static async Task WriteTomlConfigAsync(TomlTable config, string filePath)
    {
      string tomlString = Toml.FromModel(config);
      using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
      using (var writer = new StreamWriter(stream))
      {
          await writer.WriteAsync(tomlString);
      }
     }
     }
  }
  }

案内メニュー