|
|
|
.NET では、もう ini ファイルは使いません。では、どうすればいいのでしょうか。
レジストリ? app.config? 設定ファイル?
レジストリでも、HKEY_CURRENT_USERもあればHKEY_LOCAL_MACHINEもある。いったい、どうすればいいんだ?
ということでまとめてみました。
|
|
(1) Microsoft
Windows® Logo guidelines (2) Persisting
Application Settings in the .NET Framework
|
|
|
メリット |
デメリット |
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 に準拠した方法 大きなデータも扱える。 |
特になし? |
|
|
レジストリは、ユーザ固有のデータを格納する場合は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); } |
|
|
レジストリと同様に、ユーザ固有のデータを格納する場合は
ユーザごとの移動(ローミング)データ |
対象 | ユーザごとの移動データ、マシン非依存、ユーザ固有 |
クラス | 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(); } } |
|