【C#】Configファイルで、Key/Valueでは足りないとき(カスタム設定を追加する)

Sponsored Links

Configファイルの中で、appSettingsを設定することで、Configファイルの中身を変更し、環境によって変更したい値を設定することができる。
appSettingsでは、keyとvalueによって構成され、コードの方では、keyを指定し、そのvalueを取得することなどができる。
ただし、keyはあらかじめ決めておく必要があり、keyの数を増やす場合などは、コードの方の修正も伴うケースが多い。
例えば、あるフォルダから、ほかのフォルダへファイルをコピーするようなアプリを作成するときに、対象フォルダ数が決まっていれば、appSettingsでその分設定すれば良いが、徐々に増える必要があったり、増減が必要な場合は、appSettingsでは、対応しきれない。
このような時に、sectionGroupを用い、ConfigファイルのGroup内のsectionを変更することで、対応することができる。

下記の例では、sectionGroupをconfigSectionsの下に設定し、その中でsectionの設定を行う。
sectionGroupは仮に”SectionGroup1″という名前にし、<SectionGroup1>タグ配下に、実際に指定したいフォルダパスなどを指定する。
SourceFolderからDestinationFolderにコピーする対象フォルダを増やすのであれば、sectionGroup内のsectionを追加し、また、同じsectionをSectionGroup1配下に追加することで、あとは、コードの中でくるくる回してあれば良い。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<sectionGroup name="SectionGroup1" type="SampleGroup, SampleConfigApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
			<section name="Excel" type="SampleSection, SampleConfigApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
			<section name="Log" type="SampleSection, SampleConfigApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  		</sectionGroup>
	</configSections>
	<SectionGroup1>
		<Excel SourceFolder="C:\Sample1\From\" DestinationFolder="C:\Sample1\To\" />
	<Log SourceFolder="C:\Sample2\From\" DestinationFolder="C:\Sample2\To\" />
	</SectionGroup1>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
	</startup>
</configuration>

コードの方で必要になるのは、上記、sectionGroup、sectionのtypeで指定したSampleGroupとSampleSectionクラスを用意する。
Section、Groupで各々ConfigurationSection、ConfigurationSectionGroupを継承する。

//SampleSection.cs
using System;
using System.Configuration;

class SampleSection : ConfigurationSection
{
    private static ConfigurationPropertyCollection _Properties;
    private static ConfigurationProperty _SourceFolder
        = new ConfigurationProperty("SourceFolder", typeof(string), "", ConfigurationPropertyOptions.IsRequired);
    private static ConfigurationProperty _DestinationFolder
        = new ConfigurationProperty("DestinationFolder", typeof(string), "", ConfigurationPropertyOptions.IsRequired);

    public SampleSection()
    {
        _Properties = new ConfigurationPropertyCollection();
        _Properties.Add(_SourceFolder);
        _Properties.Add(_DestinationFolder);
    }
    protected override ConfigurationPropertyCollection Properties
    {
        get { return _Properties; }
    }

    [StringValidator(InvalidCharacters = ":*?<>|", MinLength = 1, MaxLength = 1000)]
    public string SourceFolder
    {
        get { return Convert.ToString(this["SourceFolder"]); }
        set { this["SourceFolder"] = value; }
    }
    [StringValidator(InvalidCharacters = ":*?<>|", MinLength = 1, MaxLength = 1000)]
    public string DestinationFolder
    {
        get { return Convert.ToString(this["DestinationFolder"]); }
        set { this["DestinationFolder"] = value; }
    }
}
//SampleGroup.cs
using System.Configuration;

class SampleGroup : ConfigurationSectionGroup
{
    public SampleSection FolderBackupSection
    {
        get { return (SampleSection)Sections.Get("SampleSection"); }
    }
}

これで、Configの内容を取得する準備が完了し、メインの方で、これらの値を取得、使用する。

namespace SampleConfigApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
            var config = ConfigurationManager.OpenExeConfiguration(exePath);
            var sectionGroup = config.GetSectionGroup("SectionGroup1");
            foreach(SampleSection section in sectionGroup.Sections)
            {
                Debug.WriteLine($"Source:{section.SourceFolder}, DestinationFolder:{section.DestinationFolder}");
            }
        }
    }
}

SectionGroup1を指定し、Configで定義されているsecion情報を取得する。
上記例では、sectionで定義されているSourceFolderとDestinationFolderを出力しているだけだが、この代わりに、コピーなどを行うことで、対象フォルダの増減を、Configのみの変更で実現する。

Visual Studio 2017のプロジェクトファイルは、こちらからダウンロードいただける。

IT
Sponsored Links
Sponsored Links
Sponsored Links
ようさんチョットでぶ
Copied title and URL
Bitnami