DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

「アプリケーション構成ファイル」を編集する

『「アプリケーション構成ファイル」を使用して設定を読み込む』ではアプリケーション構成ファイルの簡単な利用法を、「外部ファイルにコントロールのプロパティを格納する」では動的プロパティの簡単な利用法を紹介しました。ここでは「アプリケーション構成ファイル」に保存されている値の変更、追加、削除等をプログラムで行う方法を紹介します。

ただし、本来アプリケーション構成ファイルは読み取り専用の設定を保存するために使用するものですので、このようなアプリケーション構成ファイルの編集はその目的をよく考えて行ってください。通常の設定であれば、「アプリケーションの設定を保存する」のような方法を使ってください。

ここで紹介している例では、「アプリケーション構成ファイル」(Project1.exe.config)の<configuration><appSettings>に「Application Description」を追加し、「Application Name」の値を変更し、「Comment」を削除しています。binフォルダの構成ファイルを編集しているため、プロジェクトの構成ファイルは変わりません。

さらに、アプリケーション構成ファイルを編集してもその結果はすぐに反映されず、アプリケーションを起動しなおす必要があることに注意してください。

XmlDocumentクラスを使用する方法

.NET FrameworkでXMLを編集する方法は色々ありますが、ここではXmlDocumentクラスを使う方法を紹介します。

VB.NET
コードを隠すコードを選択
'構成ファイルのパスを取得
Dim asm as System.Reflection.Assembly = _
    System.Reflection.Assembly.GetExecutingAssembly()
Dim appConfigPath As String
'ファイル名は適当に変更してください
appConfigPath = System.IO.Path.GetDirectoryName(asm.Location) + _
    "\Project1.exe.config"

'構成ファイルをXML DOMに読み込む
Dim doc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
doc.Load(appConfigPath)

Dim node As System.Xml.XmlNode = doc("configuration")("appSettings")

'--------------------------------------------------------------------
'構成ファイルに新しい値
'("key"="Application Description","value"="MyApplicationDescription")
'を追加する
'--------------------------------------------------------------------
'新しいElement("add")の作成
Dim newNode As System.Xml.XmlElement =  doc.CreateElement("add") 
'Attributeを作成し、追加する
newNode.SetAttribute("key", "Application Description")
newNode.SetAttribute("value", "MyApplicationDescription")
node.AppendChild(newNode)

'--------------------------------------------------------------------
'構成ファイルの"key"="Application Name"の値を
'"value"="MyNewApplication"に変更する
'--------------------------------------------------------------------
'ノードを探す
Dim n As System.Xml.XmlNode
For Each n In doc("configuration")("appSettings")
    If n.Name = "add" Then
        '"key"="Application Name"のとき、"value"を変更する
        If n.Attributes.GetNamedItem("key").Value = "Application Name" Then
            n.Attributes.GetNamedItem("value").Value = "MyNewApplication"
        End If
    End If
Next

'--------------------------------------------------------------------
'構成ファイルの"key"="Comment"を削除する
'--------------------------------------------------------------------
'ノードを探す
Dim n2 As System.Xml.XmlNode
For Each n2 In doc("configuration")("appSettings")
    If n2.Name = "add" Then
        '"key"="Comment"のとき、削除する
        If n2.Attributes.GetNamedItem("key").Value = "Comment" Then
            doc("configuration")("appSettings").RemoveChild(n2)
        End If
    End If
Next

'変更された構成ファイルを保存する
doc.Save(appConfigPath)
C#
コードを隠すコードを選択
//構成ファイルのパスを取得
System.Reflection.Assembly asm =
    System.Reflection.Assembly.GetExecutingAssembly();
string appConfigPath;
//ファイル名は適当に変更してください
appConfigPath = System.IO.Path.GetDirectoryName(asm.Location) +
    @"\Project1.exe.config";

//構成ファイルをXML DOMに読み込む
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(appConfigPath);

System.Xml.XmlNode node = doc["configuration"]["appSettings"];

//-------------------------------------------------------------------
//構成ファイルに新しい値
//("key"="Application Description","value"="MyApplicationDescription")
//を追加する
//-------------------------------------------------------------------
//新しいElement("add")の作成
System.Xml.XmlElement newNode = doc.CreateElement("add");
//Attributeを作成し、追加する
newNode.SetAttribute("key", "Application Description");
newNode.SetAttribute("value", "MyApplicationDescription");
node.AppendChild(newNode);

//-------------------------------------------------------------------
//構成ファイルの"key"="Application Name"の値を
//"value"="MyNewApplication"に変更する
//-------------------------------------------------------------------
//ノードを探す
foreach (System.Xml.XmlNode n in doc["configuration"]["appSettings"])
{
    if (n.Name == "add")
    {
        //"key"="Application Name"のとき、"value"を変更する
        if (n.Attributes.GetNamedItem("key").Value == "Application Name")
            n.Attributes.GetNamedItem("value").Value = "MyNewApplication";
    }
}

//-------------------------------------------------------------------
//構成ファイルの"key"="Comment"を削除する
//-------------------------------------------------------------------
//ノードを探す
foreach (System.Xml.XmlNode n in doc["configuration"]["appSettings"])
{
    if (n.Name == "add")
    {
        //"key"="Comment"のとき、削除する
        if (n.Attributes.GetNamedItem("key").Value == "Comment")
            doc["configuration"]["appSettings"].RemoveChild(n);
    }
}

//変更された構成ファイルを保存する
doc.Save(appConfigPath);

.NET Framework 2.0以降で、AppSettingsSectionを使用する方法

.NET Framework 2.0以降では、ConfigurationクラスAppSettingsプロパティを使うことにより、構成ファイルの設定を簡単に扱うことができます。Configurationクラスを使うには、System.Configuration.dllが参照設定に追加されている必要があります。

Configurationクラスを使った例を以下に示します。

VB.NET
コードを隠すコードを選択
'Configurationの作成
'ConfigurationUserLevel.Noneでアプリケーション構成ファイルを開く
Dim config As System.Configuration.Configuration = _
    System.Configuration.ConfigurationManager.OpenExeConfiguration( _
    System.Configuration.ConfigurationUserLevel.None)

'--------------------------------------------------------------------
'構成ファイルに新しい値
'("key"="Application Description","value"="MyApplicationDescription")
'を追加する
'--------------------------------------------------------------------
config.AppSettings.Settings.Add( _
    "Application Description", "MyApplicationDescription")

'--------------------------------------------------------------------
'構成ファイルの"key"="Comment"を削除する
'--------------------------------------------------------------------
'"Comment"が見つからなくても例外はスローされない
config.AppSettings.Settings.Remove("Comment")

'--------------------------------------------------------------------
'構成ファイルの"key"="Application Name"の値を
'"value"="MyNewApplication"に変更する
'--------------------------------------------------------------------
config.AppSettings.Settings("Application Name").Value = "MyNewApplication"

'保存する
config.Save()
C#
コードを隠すコードを選択
//Configurationの作成
//ConfigurationUserLevel.Noneでアプリケーション構成ファイルを開く
System.Configuration.Configuration config =
    System.Configuration.ConfigurationManager.OpenExeConfiguration(
    System.Configuration.ConfigurationUserLevel.None);

//-------------------------------------------------------------------
//構成ファイルに新しい値
//("key"="Application Description","value"="MyApplicationDescription")
//を追加する
//-------------------------------------------------------------------
config.AppSettings.Settings.Add(
    "Application Description", "MyApplicationDescription");

//-------------------------------------------------------------------
//構成ファイルの"key"="Comment"を削除する
//-------------------------------------------------------------------
//"Comment"が見つからなくても例外はスローされない
config.AppSettings.Settings.Remove("Comment");

//-------------------------------------------------------------------
//構成ファイルの"key"="Application Name"の値を
//"value"="MyNewApplication"に変更する
//-------------------------------------------------------------------
config.AppSettings.Settings["Application Name"].Value = "MyNewApplication";

//保存する
config.Save();
  • 履歴:
  • 2007/2/2 .NET Framework 2.0に関する記述を追加。
  • 2013/5/14 Configurationクラスを使った方法で、値を変更する方法を変えた。(コメントでご指摘頂きました。)

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。