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のプロジェクトファイルは、こちらからダウンロードいただける。