C#でアプリの設定を保存する

アプリの設定を保存する方法はいくつかありますが、レジストリやiniファイルはあまり使いたくないので、アプリケーション構成ファイルを使ってみたいと思います。 試した環境は下記です。OSのバージョンによって、ファイルの保存フォルダが変わったりします。

  • Visual Studio Express 2015 for Windows Desktop (C#)

  • Windows8.1

目次

  1. アプリケーション構成ファイルに値を設定する
  2. 設定値を取得してみる
  3. 値を設定してみる
  4. ユーザー毎の設定値を規定値に戻す
  5. まとめ

アプリケーション構成ファイルに値を設定する

新しいプロジェクトを作ってフォームだけの状態でそのままビルドすると、実行ファイルと同じフォルダに.exe.configという拡張子のファイルが作られます。このファイルをアプリケーション構成ファイルといいます。MSDSによると、このファイルにはアプリケーション固有の設定を記述するのだそうです。素の.exe.configファイルを開いてみると、中身は下記のようなXMLフォーマットの文書になっています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

ソリューションエクスプローラーのスパナのマークをクリックすると、設定タブが開きます。 151215-1-01 右クリックすると、設定を追加するメニューが表示されます。 151215-1-02 下図の様に設定を追加してみます。 151215-1-03 そしてそのままビルドすると、.exe.configは下記のようになります。スコープをアプリケーションスコープにした設定はapplicationSettingsに、ユーザースコープにした設定はuserSettingsに記述されていますね。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        中略
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <userSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_user" serializeAs="String">
                <value>ユーザースコープのテキスト</value>
            </setting>
        </setting_trial.Properties.Settings>
    </userSettings>
    <applicationSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_app" serializeAs="String">
                <value>アプリケーションスコープのテキスト</value>
            </setting>
        </setting_trial.Properties.Settings>
    </applicationSettings>
</configuration>

設定値を取得してみる

.exe.configファイルから、設定値を取得してみます。まず、フォームにテキストボックスを2つ置きます。textBox1にtext_appの値を、textBox2にtext_userの値を入れます。 151215-1-04 コードは下記のようにします。

namespace setting_trial
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // app.exe.configから設定値を取得する。
            textBox1.Text = Properties.Settings.Default.text_app;
            textBox2.Text = Properties.Settings.Default.text_user;
        }
    }
}

実行すると、下図の様に設定値が得られます。 151215-1-05

値を設定してみる

.exe.configに値を設定してみます。フォームのFormClosingイベントに下記のコードを記述してみます。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // app.exe.configに値を設定する。
    Properties.Settings.Default.text_app = textBox1.Text; // この行はエラーになる
    Properties.Settings.Default.text_user = textBox2.Text;
    Properties.Settings.Default.Save();
}

そうすると、text_appへ値を代入する行で「プロパティまたはインデクサー 'Settings.text_app' は読み取り専用であるため、割り当てることはできません」というエラーが出ます。アプリケーションスコープの設定値は、読み取り専用なんですね。というわけで、当該行を削除して実行してみます。 textBox2に「改変」と入力して、アプリを終了します。 151215-1-06 そして、.exe.configファイルを開いてみると

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        中略
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <userSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_user" serializeAs="String">
                <value>ユーザースコープのテキスト</value>
            </setting>
        </setting_trial.Properties.Settings>
    </userSettings>
    <applicationSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_app" serializeAs="String">
                <value>アプリケーションスコープのテキスト</value>
            </setting>
        </setting_trial.Properties.Settings>
    </applicationSettings>
</configuration>

あれ、変わってないですね。でもビルドしたアプリを再度立ち上げると、textBox2には「改変」と表示されます。これは、ユーザー用の設定ファイルに変更内容が保存されたのですね。ユーザー用の変更ファイルはWindows8.1では下記のフォルダのサブフォルダにあります。

C:\Users\アカウント名\AppData\Local\アプリ名\

上記フォルダ以下にあるuser.configというファイルを開いてみると、下記のようになっています。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_user" serializeAs="String">
                <value>改変</value>
            </setting>
        </setting_trial.Properties.Settings>
    </userSettings>
</configuration>

試しにこのフォルダを削除してからビルド済みのアプリを起動すると、textBox2には「ユーザースコープのテキスト」と表示されます。

ユーザー毎の設定値を規定値に戻す

設定をユーザーの設定値から規定値に戻したい時もありますよね。そういう場合はreset()メソッドを使います。フォームにボタンを追加して、ボタンのclickイベントに下記のコードを書いてみます。

private void button1_Click(object sender, EventArgs e)
{
    // 設定を規定値に戻す
    Properties.Settings.Default.Reset();
    textBox2.Text = Properties.Settings.Default.text_user;
}

アプリを起動してボタンをクリックすると、textBox2の内容がアプリの規定値に変わります。そのままアプリを終了すると、C:\Users\アカウント名\AppData\Local\アプリ名\中略\user.configの中身は下記のようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <setting_trial.Properties.Settings>
            <setting name="text_user" serializeAs="String">
                <value>ユーザースコープのテキスト</value>
            </setting>
        </setting_trial.Properties.Settings>
    </userSettings>
</configuration>

設定値が、アプリの規定値に変わりましたね。

まとめ

  • Visual Studioのプロジェクトのプロパティで、アプリの設定を設定できる。

  • 設定値は実行ファイルのアプリ名.configファイルに保存される。

  • 設定値にはスコープが2つある。

  • アプリケーションスコープはアプリからの変更は不可。ユーザースコープはアプリから変更可。

  • Properties.Settings.Default.Save()メソッドで設定値を保存できる。保存先は、C:\Users\アカウント名\AppData\Local\アプリ名\中略\user.config。(環境によって異なる。)

  • ユーザーが設定した設定値(user.configの値)をアプリの規定値(app.configの値)に戻すには、Properties.Settings.Default.Reset()メソッドを使う。

公開日

広告