このページの最終更新日 2020/10/25

アプリケーションの設定情報の保存 - 導入編

1. Visual Studioの設定情報の保存機能を利用する

 Windowsアプリにユーザーが入力した情報を、アプリケーションが終了しても入力された情報は保存しておき、再度アプリケーションを立ち上げたときは保存された情報をアプリケーションで自動的に読み込むようにしたいとします。単純な方法ではアプリケーション実行ファイルと同一のフォルダにテキストファイルを吐き出し、このテキストファイルに入力された情報を書き出すやり方でしょうか。これはこれで悪い方法ではないと思います。
 ただ、アプリの設定情報の保存機能というのは案外大変になることも多いものです。この節では、アプリの保存方法の例をいくつか挙げ、メリットとデメリットを論じていきたいと思います。アプリの設定情報の保存方法として一番手っ取り早い方法は、Visual Studioの設定情報の保存機能を使うことでしょうか。
 pic.1のようにアプリケーションの設定項目から、保存したい情報のプロパティ名とデフォルトの値を入力します。ここでは String1、Datetime1 というプロパティ名の情報を保存したいとします。

VisualStudioのアプリケーション設定

- pic.1 -

 pic.2の設定は絶対に必要という訳ではないのですが、設定しておくと後で理解しやすくなるので設定しておきます。まずアプリケーション欄の「アセンブリ情報」ボタンをクリックします。ここで会社名と、アセンブリバージョンを入力しておきます。これはpic.2の通りでなくて構いませんので適当に何かしらの文字を入力しておいて下さい。

VisualStudioで設定するアセンブリ情報

- pic.2 -

 さて、VisualStudioの設定情報の保存機能を使って、アプリケーションで使用した変数を、アプリケーションが閉じられた後でも保存されるようにしましょう。プログラムのソースコードは次の通りです。

- code.1 -
 class Program
 {
     static void Main(string[] args)
     {
        Console.WriteLine("String1 = " + Properties.Settings.Default.String1);
        Console.WriteLine("Datetime1 = " + Properties.Settings.Default.Datetime1.ToString("yyyy年MM月dd日"));

        Properties.Settings.Default.String1 = "コムスコシステムズ";
        Properties.Settings.Default.Datetime1 = DateTime.Parse("2018/06/27");
        Properties.Settings.Default.Save();

        Console.WriteLine("何かしらのキーを押すと終了します。");
        Console.ReadLine();
    }
}

 では、このコードを実行します。まずは初めて実行したときの実行結果をpic.3に記載します。5・6行目に Properties.Settings.Default.[プロパティ名]の値を出力していますが、この段階ではVisualStudioで入力したデフォルト値が出力されています。その後の8~10行目でプロパティに値を入力して保存します。

アプリケーション情報が保存される前の、コンソールの出力結果

- pic.3 -

 1度コンソールを閉じて、再度コードを実行した出力結果をpic.4に記載します。8~10行目で保存された情報が適切に取り出せていることが解りますね。

アプリケーション情報が保存される後の、コンソールの出力結果

- pic.4 -

 ここまでに示したように、VisualStudioの設定保存機能はさっくり作るにはとても便利ですし実際の開発の場でも使えると思います。しかし同時に色々と物議を醸すこともあったりもします。
 ときどきユーザーから聞かれることは「これってどこに保存されてるんですか」という質問です。保存される情報が何かしらおおやけにしたくない情報を含んでいる場合、その情報がユーザーから見て良く解らない場所に保存されているのはあまり気持ちの良いものではありません。もちろん本当に公開すべきでない情報に対しては暗号化して保存することが原則です。
 Windows7もしくはWindows10で保存されている場所は、まず「C:¥Users¥[ユーザー名]¥AppData¥Local¥[会社名]」と辿ります。ここでAppDataフォルダは隠しになっていますので、エクスプローラーの設定「隠しファイル」を見える状態にしておきます。すると、アプリケーション名とアプリケーションのファイルパスのハッシュ値を繋げたフォルダが見つかります。さらにその中にバージョンの書かれたフォルダがあり、その中に「user.config」というファイルが見つかります。pic.2のような設定を行っている場合には 「C:¥Users¥[ユーザー名]¥AppData¥Local¥ComscoSystems¥SaveVariableApp.exe_Url_[ハッシュ値]¥3.2.1.0¥user.config」 が設定ファイルが保存されているファイルパスになります。

AppDataに保存された.NETアプリケーションの情報

- pic.5 -

 user.configファイルでは次のようにXML形式でデータが保存されています。

「user.config」
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <SaveVariableApp.Properties.Settings>
            <setting name="String1" serializeAs="String">
                <value>コムスコシステムズ</value>
            </setting>
            <setting name="Datetime1" serializeAs="String">
                <value>2018-06-27</value>
            </setting>
        </SaveVariableApp.Properties.Settings>
    </userSettings>
</configuration>

VisualStudioの設定保存機能を使った場合には、以下の[1][2]のことが問題になる場合があります。
 [1] アプリケーション実行ファイルのフォルダ場所やファイル名を変更した場合、user.configファイルの保存場所にファイルパスのハッシュ値が含まれていることから判断出来るように別のuser.configが生成されます。そのため設定情報がデフォルト値に戻ってしまいます。また、設定ファイルを他人と共有したい場合や、同じユーザーであっても別のパソコンでアプリケーションを使用する際に設定ファイルを使いまわすことが難しいです。
 [2] 配列情報を保存したい場合は、文字列の配列しか残すことが出来ません。整数の配列を残したい場合は、整数型として情報をuser.configに残すことが出来ないため、整数の配列を文字列の配列に変換するなどの対応を取るなどの必要があります。またクラスの内部に別のクラスを包括しているなどの構造を、そのままの形で残すことは出来ません。

 これらの問題を解決するには、何か別の方法を考える必要があります。考えられる方法は色々とあると思いますが、次のページ「DataContractJsonSerializerクラスを使用して保存する」では DataContractJsonSerializerクラスを使って、Json形式でデータを残す方法について纏めていきたいと思います。