(同じ利用者による、間の7版が非表示)
674行目: 674行目:
<br>
<br>
また、大きなサイズなTOMLファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
また、大きなサイズなTOMLファイルを扱う場合は、ストリーミング処理を使用することを推奨する。<br>
<br>
==== 使用するTOMLファイル ====
<syntaxhighlight lang="toml">
# 使用するTOMLファイル
title = "設定ファイル"  # トップレベルのキー
[user]                # ユーザ情報のセクション
name = "山田太郎"
age = 30
email = "yamada@example.com"
[application]        # アプリケーション設定のセクション
version = "1.0.0"
debug_mode = false
[database]            # データベース接続情報のセクション
host = "localhost"
port = 5432
username = "admin"
password = "secret"
[features]            # 機能のオン / オフを制御するセクション
enabled = ["login", "logout", "dashboard"]
disabled = ["admin_panel"]
[logging]            # ロギング設定のセクション
level = "info"
file = "/var/log/app.log"
[[servers]]          # サーバ情報の配列
ip = "192.168.1.1"
role = "frontend"
[[servers]]          # サーバ情報の配列
ip = "192.168.1.2"
role = "backend"
</syntaxhighlight>
<br>
<br>
==== TOMLファイルの読み込み ====
==== TOMLファイルの読み込み ====
以下の例では、指定されたTOMLファイルを非同期で読み込み、その内容を解析・表示している。<br>
<br>
* 非同期処理
*: ファイルの読み込み・解析では、await TOML.ParseAsync(reader)メソッドを使用する。
* ストリーミング処理
*: StreamReaderクラスを使用して、ファイルをストリームとして読み込む。
* 構造化されたデータの読み込み
*: セクションごとに適切にデータを読み込み・表示している。
*: 配列データ (例: features、servers) は、繰り返し文を使用して処理する。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Threading.Tasks;
using Tommy;
class Program
{
    static async Task Main(string[] args)
    {
      string filePath = "sample.toml";  // TOMLファイルのパス
      try
      {
          // TOMLファイルを非同期で読み込む
          using (var reader = new StreamReader(filePath))
          {
            var toml = await TOML.ParseAsync(reader);
            // トップレベルのキーを読み込む
            Console.WriteLine($"タイトル: {toml["title"]}");
            // ユーザ情報のセクションを読み込む
            var user = toml["user"];
            Console.WriteLine($"ユーザ名: {user["name"]}");
            Console.WriteLine($"年齢: {user["age"]}");
            Console.WriteLine($"メール: {user["email"]}");
            // アプリケーション設定のセクションを読み込む
            var app = toml["application"];
            Console.WriteLine($"バージョン: {app["version"]}");
            Console.WriteLine($"デバッグモード: {app["debug_mode"]}");
            // データベース接続情報のセクションを読み込む
            var db = toml["database"];
            Console.WriteLine($"ホスト: {db["host"]}");
            Console.WriteLine($"ポート: {db["port"]}");
            Console.WriteLine($"ユーザ名: {db["username"]}");
            Console.WriteLine($"パスワード: {db["password"]}");
            // 機能のオン / オフを制御するセクションを読み込む
            var features = toml["features"];
            Console.WriteLine("有効な機能:");
            foreach (var feature in features["enabled"].AsArray)
            {
                Console.WriteLine($"- {feature}");
            }
            Console.WriteLine("無効な機能:");
            foreach (var feature in features["disabled"].AsArray)
            {
                Console.WriteLine($"- {feature}");
            }
            // ロギング設定のセクションを読み込む
            var logging = toml["logging"];
            Console.WriteLine($"ログレベル: {logging["level"]}");
            Console.WriteLine($"ログファイル: {logging["file"]}");
            // サーバ情報の配列を読み込む
            var servers = toml["servers"].AsArray;
            Console.WriteLine("サーバ情報:");
            foreach (var server in servers)
            {
                Console.WriteLine($"IP: {server["ip"]}, 役割: {server["role"]}");
            }
          }
      }
      catch (FileNotFoundException)
      {
          Console.WriteLine($"エラー: ファイル '{filePath}' が存在しない");
      }
      catch (TomlParseException ex)
      {
          Console.WriteLine($"エラー: TOMLファイルの解析に失敗  行 {ex.Line}, 列 {ex.Column}: {ex.Message}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
}
</syntaxhighlight>
<br>
==== TOMLファイルの書き込み ====
以下の例では、指定されたTOMLファイルの構造に従ってデータを作成して、非同期でファイルに書き込んでいる。<br>
<br>
* 非同期処理
*: ファイルの書き込みでは、await tomlTable.WriteToAsync(writer)メソッドを使用している。
* ストリーミング処理
*: StreamWriterクラスを使用して、ファイルをストリームとして書き込んでいる。
* 構造化されたデータの作成
*: TomlTableとTomlArrayを使用して、TOMLファイルの構造を再現している。
*: セクションごとに適切にデータを構造化している。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Threading.Tasks;
using Tommy;
class Program
{
    static async Task Main(string[] args)
    {
      string filePath = "sample.toml";  // 書き込むTOMLファイルのパス
      try
      {
          // TOMLデータを作成
          var tomlTable = 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 TomlArray { "login", "logout", "dashboard" },
                ["disabled"] = new TomlArray { "admin_panel" }
            },
            // ロギング設定のセクション
            ["logging"] = new TomlTable
            {
                ["level"] = "info",
                ["file"] = "/var/log/app.log"
            },
            // サーバ情報の配列
            ["servers"] = new TomlArray
            {
                new TomlTable
                {
                  ["ip"] = "192.168.1.1",
                  ["role"] = "frontend"
                },
                new TomlTable
                {
                  ["ip"] = "192.168.1.2",
                  ["role"] = "backend"
                }
            }
          };
          // ファイルを非同期で書き込む
          using (var writer = new StreamWriter(filePath))
          {
            await tomlTable.WriteToAsync(writer);
          }
      }
      catch (IOException ex)
      {
          Console.WriteLine($"エラー: ファイルの書き込み中にIOエラーが発生: {ex.Message}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
}
</syntaxhighlight>
<br>
==== TOMLファイルの修正 ====
以下の例では、指定されたTOMLファイルを読み込み、以下に示す設定を変更して、同じファイルに上書きしている。<br>
<br>
* 非同期処理
*: ファイルの読み込みでは、await TOML.ParseAsync(reader)メソッドを使用している。
*: ファイルの書き込みでは、await toml.WriteToAsync(writer)メソッドを使用している。
* ストリーミング処理
*: StreamReaderクラスおよびStreamWriterクラスを使用して、ファイルをストリームとして読み書きしている。
* TOMLファイルの更新
*: UpdateConfigメソッドで、指定された変更を行っている。
*:* [application]セクション -> "version"キーの値を"1.1.0"に変更する。
*:* [logging]セクション -> "level"キーそのものを削除する。
*:* [features]セクション -> "enabled"キーの配列から"logout"を削除する。
*:* 2つ目の<nowiki>[[servers]]</nowiki>配列 -> "ip"キーの値を"192.168.1.10"に変更する。
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Tommy;
class Program
{
    static async Task Main(string[] args)
    {
      string filePath = "sample.toml";  // 修正するTOMLファイルのパス
      try
      {
          // TOMLファイルを非同期で読み込む
          using (var reader = new StreamReader(filePath))
          {
            var toml = await TOML.ParseAsync(reader);
            // [application]セクションの"version"キーの値を"1.1.0"に変更
            toml["application"]["version"] = "1.1.0";
            // [logging]セクションの"level"キーを削除
            toml["logging"].Remove("level");
            // [features]セクションの"enabled"キーの配列から"logout"を削除
            var enabledFeatures = toml["features"]["enabled"].AsArray;
            enabledFeatures.Remove("logout");
            // 2つ目の[[servers]]配列の"ip"キーの値を"192.168.1.10"に変更
            var servers = toml["servers"].AsArray;
            if (servers.Count >= 2)
            {
                servers[1]["ip"] = "192.168.1.10";
            }
            else
            {
                Console.WriteLine("警告: 2つ目のサーバ情報が存在しない");
            }
            // 変更した内容を非同期でファイルに書き込む
            using (var writer = new StreamWriter(filePath))
            {
                await toml.WriteToAsync(writer);
            }
          }
      }
      catch (FileNotFoundException)
      {
          Console.WriteLine($"エラー: ファイル '{filePath}' が存在しない");
      }
      catch (TomlParseException ex)
      {
          Console.WriteLine($"エラー: TOMLファイルの解析に失敗  行 {ex.Line}, 列 {ex.Column}: {ex.Message}");
      }
      catch (IOException ex)
      {
          Console.WriteLine($"エラー: ファイルの読み書き中にIOエラーが発生: {ex.Message}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
}
</syntaxhighlight>
<br>
修正後のTOMLファイルを以下に示す。<br>
<syntaxhighlight lang="toml">
# 修正後のTOMLファイル
title = "設定ファイル"      # トップレベルのキー
[user]                    # ユーザ情報のセクション
name = "山田太郎"
age = 30
email = "yamada@example.com"
[application]              # アプリケーション設定のセクション
version = "1.1.0"          # "1.0.0" から "1.1.0" に変更
debug_mode = false
[database]                # データベース接続情報のセクション
host = "localhost"
port = 5432
username = "admin"
password = "secret"
[features]                # 機能のオン / オフを制御するセクション
enabled = ["login", "dashboard"]  # "logout" が配列から削除
disabled = ["admin_panel"]
[logging]                  # ロギング設定のセクション
file = "/var/log/app.log"  # "level" キーが削除
[[servers]]                # サーバ情報の配列
ip = "192.168.1.1"
role = "frontend"
[[servers]]                # サーバ情報の配列
ip = "192.168.1.10"        # "192.168.1.2" から "192.168.1.10" に変更
role = "backend"
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]