■概要
C#でTOMLファイル読み書き
■環境
- Windows 10
- Visual Studio Community 2019 Version 16.6.4
- .NET Framework 4.5.2/.NET Core 3.1
■準備
NuGetでNett
をインストール
■画面イメージ
TomlTestCore.toml(設定ファイル)
Width=650.0[InputItems]Item1="あいうえお"Item2="@@@@@@@@@"Item3="zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"Item4=12
■コード
.NET CoreでTomlTestCore
というプロジェクト名で作成。
MainWindow.xaml
<Windowx:Class="TomlTestCore.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:TomlTestCore"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="650"Height="250"ResizeMode="CanResizeWithGrip"mc:Ignorable="d"><Window.Resources><!-- 項目ラベルスタイル --><Stylex:Key="ItemLabelStyle"TargetType="Label"><SetterProperty="Width"Value="80"/><SetterProperty="Margin"Value="5"/></Style><!-- 入力項目スタイル --><Stylex:Key="ItemInputStyle"TargetType="TextBox"><SetterProperty="Width"Value="300"/><SetterProperty="Margin"Value="5"/><SetterProperty="VerticalContentAlignment"Value="Center"/><EventSetterEvent="GotFocus"Handler="ItemInput_GotFocus"/></Style><!-- ボタン既定スタイル --><StyleTargetType="Button"><SetterProperty="Width"Value="100"/><SetterProperty="Height"Value="35"/><SetterProperty="Margin"Value="5,15,5,5"/></Style></Window.Resources><StackPanelBackground="LavenderBlush"FocusManager.FocusedElement="{Binding ElementName=Item1}"><StackPanelOrientation="Horizontal"><LabelContent="項目1(_1)"Style="{StaticResource ItemLabelStyle}"Target="{Binding ElementName=Item1}"/><TextBoxx:Name="Item1"Style="{StaticResource ItemInputStyle}"/></StackPanel><StackPanelOrientation="Horizontal"><LabelContent="項目2(_2)"Style="{StaticResource ItemLabelStyle}"Target="{Binding ElementName=Item2}"/><TextBoxx:Name="Item2"Style="{StaticResource ItemInputStyle}"/></StackPanel><DockPanelLastChildFill="True"><LabelContent="項目3(_3)"DockPanel.Dock="Left"Style="{StaticResource ItemLabelStyle}"Target="{Binding ElementName=Item3}"/><TextBoxx:Name="Item3"Width="Auto"Style="{StaticResource ItemInputStyle}"/></DockPanel><StackPanelOrientation="Horizontal"><LabelContent="項目4(_4)"Style="{StaticResource ItemLabelStyle}"Target="{Binding ElementName=Item4}"/><TextBoxx:Name="Item4"Width="40"MaxLength="3"Style="{StaticResource ItemInputStyle}"/></StackPanel><StackPanelOrientation="Horizontal"><Buttonx:Name="SaveButton"Click="SaveButton_Click"Content="保存(_S)"/><Buttonx:Name="LoadButton"Click="LoadButton_Click"Content="読み込み(_L)"/><Buttonx:Name="ClearButton"Click="ClearButton_Click"Content="クリア(_C)"/></StackPanel></StackPanel></Window>
MainWindow.xaml.cs
usingNett;usingSystem;usingSystem.Windows;usingSystem.Windows.Controls;namespaceTomlTestCore{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();}/// <summary>/// 画面の値を設定ファイルに保存/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidSaveButton_Click(objectsender,RoutedEventArgse){vartoml=Toml.Create();toml.Add("Width",Width);varinputItems=Toml.Create();inputItems.Add("Item1",Item1.Text);inputItems.Add("Item2",Item2.Text);inputItems.Add("Item3",Item3.Text);inputItems.Add("Item4",int.TryParse(Item4.Text,outinti)?i:99);toml.Add("InputItems",inputItems);Toml.WriteFile(toml,GetConfigFilePath());}/// <summary>/// 設定ファイルの値を画面に読み込み/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidLoadButton_Click(objectsender,RoutedEventArgse){vartoml=Toml.ReadFile(GetConfigFilePath());Width=toml.Get<double>("Width");varinputItems=toml.Get<TomlTable>("InputItems");Item1.Text=inputItems.Get<string>("Item1");Item2.Text=inputItems.Get<string>("Item2");Item3.Text=inputItems.Get<string>("Item3");Item4.Text=inputItems.Get<int>("Item4").ToString();}/// <summary>/// 画面クリア/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidClearButton_Click(objectsender,RoutedEventArgse){Item1.Clear();Item2.Clear();Item3.Clear();Item4.Clear();Item1.Focus();}/// <summary>/// テキストボックスフォーカス取得時/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidItemInput_GotFocus(objectsender,RoutedEventArgse){// 全選択(senderasTextBox).SelectAll();}/// <summary>/// 設定ファイルのフルパスを取得/// </summary>/// <returns>設定ファイルのフルパス</returns>privatestringGetConfigFilePath(){// 実行ファイルのフルパスを取得stringappFilePath=System.Reflection.Assembly.GetEntryAssembly().Location;// 実行ファイルのフルパス末尾(拡張子)を変えて返すreturnSystem.Text.RegularExpressions.Regex.Replace(appFilePath,"\\.exe|dll$","toml",System.Text.RegularExpressions.RegexOptions.IgnoreCase);}}}