C# Programming

Image

設定情報の扱い

開発環境: Visual Studio 2003 

1.目次

2.目的

.NET では、もう ini ファイルは使いません。では、どうすればいいのでしょうか。

レジストリ? app.config?  設定ファイル?

レジストリでも、HKEY_CURRENT_USERもあればHKEY_LOCAL_MACHINEもある。いったい、どうすればいいんだ?

ということでまとめてみました。

3.参考書

(1) Microsoft Windows® Logo guidelines
(2) Persisting Application Settings in the .NET Framework

4.設定情報の格納方法

 
  メリット デメリット
INIファイル 過去のアプリとの互換性維持をする場合 .NETでは推奨されていない。
レジストリ 一般のユーザはアクセスしにくい。
多くのバックアッププログラムは、レジストリを自動的にバックアップしてくれる。
Microsoft Windows® Logo guidelines for registry usageにしたがっている限り、
適切。
操作に失敗するとシステムに致命的な障害を与える可能性あり。

書き込める上限のガイドラインがある。(HKCU+HKLM で128Kを超えてはいけない。)

app.config .NETのお作法 アプリケーション共通の設定のみ。.NET Framework 1.0, 1.1 では読み込みだけ。
\Documents and Settings以下の設定ファイル Microsoft Windows Logo Guidelines に準拠した方法

大きなデータも扱える。

特になし?

 

5.レジストリ

レジストリは、ユーザ固有のデータを格納する場合はHKEY_CURRENT_USER(略して HKCU)を使用します。一方、ユーザに共通、マシン共通なデータを格納する場合は、HKEY_LOCAL_MACHINE(略して HKLM)があります。
     

ユーザごとの移動データ
対象ユーザ固有のデータでマシン非依存
クラスUserAppDataRegistry
レジストリHKEY_CURRENT_USER\ Software\ [Control.CompanyName]\[Control.ProductName]\ [Control.ProductVersion]

 

データサイズ64KB以下が目安
書き込みコード try
{
Application.UserAppDataRegistry.SetValue   ("ConnString", connectionString);
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message );
}
読み込みコードtry
{
    if(Application.UserAppDataRegistry.GetValue("ConnString") != null)
    {
        connectionString = Application.UserAppDataRegistry.GetValue(
"ConnString").ToString();
      }
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}

 

ユーザに共通、マシン共通のデータ、非移動データ
対象ユーザに共通、マシン共通、非移動データ
クラスCommonAppDataRegistry
レジストリHKEY_LOCAL_MACHINE\Software\[Control.CompanyName]\[Control.ProductName]\[Control.ProductVersion]
データサイズHKCU+HKLM で128Kを超えてはいけない。
書き込みコード例 try
{
Application.CommonAppDataRegistry.SetValue   ("ConnString", connectionString);
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message );
}
読み込みコード例try
{
    if(Application.CommonAppDataRegistry.GetValue("ConnString") != null)
    {
        connectionString = Application.CommonAppDataRegistry.GetValue(
"ConnString").ToString();
      }
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}

6.\Documents and Settings以下の設定ファイル

レジストリと同様に、ユーザ固有のデータを格納する場合は
     

ユーザごとの移動(ローミング)データ
対象ユーザごとの移動データ、マシン非依存、ユーザ固有
クラスUserAppDataPath
ファイルパス[UserName]\Application Data\[Control.CompanyName]\[Control.ProductName]\[Control.ProductVersion]
備考ウィンドウの設定などの小さなデータ

 

ユーザごとの非移動データ
対象ユーザに共通、マシン共通
クラスLocalUserAppDataPath
レジストリ[UserName]\Local Settings\Application Data\[Control.CompanyName]\[Control.ProductName]\[Control.ProductVersion]
備考他のPCへ移すと問題があるデータ
ファイル転送に時間がかかるような大きなデータ
例:モニタの解像度、IEの画像キャッシュ、大きなデータ

 

ユーザに共通、マシン共通のデータ
対象ユーザに共通、マシン共通、非移動データ
クラスCommonAppDataPath
レジストリAll Users\Application Data\[Control.CompanyName]\[Control.ProductName]\[Control.ProductVersion]
備考他のPCへ移すと問題があるデータ
作成した人のみが書き込み権限を持つ

 

書き込みコード例
StreamWriter myWriter = null;
XmlSerializer mySerializer = null;
try
{
mySerializer = new XmlSerializer(
typeof(ApplicationSettings));
myWriter =
new StreamWriter(Application.LocalUserAppDataPath
+ @"\myApplication.config",false);
mySerializer.Serialize(myWriter, this);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if(myWriter != null)
{
myWriter.Close();
}
}
読み込みコード例
try
{
mySerializer = new XmlSerializer(typeof(ApplicationSettings));
FileInfo fi = new FileInfo(Application.LocalUserAppDataPath
+ @"\myApplication.config");
if(fi.Exists)
{
myFileStream = fi.OpenRead();
ApplicationSettings myAppSettings =
(ApplicationSettings)mySerializer.Deserialize(
myFileStream);
this.m_backColor = myAppSettings.BackColor;
this.m_formLocation = myAppSettings.FormLocation;
this.m_defaultDirectory = myAppSettings.DefaultDirectory;
fileExists = true;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if(myFileStream != null)
{
myFileStream.Close();
}
}