13,040
回編集
| 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); | |||
} | |||
} | } | ||
} | } | ||