[.NET] Configurationファイル

configurationmanager classを使って任意名のファイルを指定するときにはまった注意点メモ。

MSDNのConfigurationManager classのサンプル
http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

最初にConfigurationManager classのサンプルを見ながら、roamingの下にデフォルトファイル名でconfigを作った。
デフォルトではappli.exe.config_url_xxxxxxxxxxxxxxxxxxxxxxxxx のようなフォルダ名の下に user.configというファイルが作られる。
configファイルがuser.configとなっているのがなんとなく気持ちが悪い。どのアプリケーションのconfigファイルなのかファイル名だけでは見分けがつかない。また、フォルダ名がアプリケーションソフトウェア名そのものでないのも違和感がある。
Roamingフォルダ以下を使うアプリケーションソフトウェアの多くはアプリケーション名や企業名のみをフォルダ名に使っている。たとえば、”Roaming\Microsoft”とか、”Roaming\Abode”などと言った具合だ。その中にひとつだけ長いのはユーザに「変なアプリ」だと思われる可能性もある。

それで、configuration fileのpathをプログラム上で指定してOpenExeConfigurationを呼んでみた。

      string exePath = System.IO.Path.Combine(
          Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), applicationName);
      // Get the configuration file. The file name has
      // this format appname.exe.config.
      System.Configuration.Configuration config =
        ConfigurationManager.OpenExeConfiguration(exePath);

ところがこれだとexePathが無効、という例外が発生する。OpenExeConfiguration がpathを引数にした場合、ファイルが存在しないときには例外になってしまうらしい。
例外は無視してconfig == nullのときは、config.SaveAs()を使って新しいファイルを保存してしまえばいいようだ。

別の方法としては、PathをExeConfigurationFileMapのExeConfigFilenameとして設定した上でOpenMappedExeConfigurationを使うやり方がある。存在しないフォルダやファイル名は初回のアクセスで作成されるので便利だ。

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "ここにpathを書く" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

上記でmapを作る部分は

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "ここにpathを書く";

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

としても同じ。
この方法はstackoverflow.comの以下の情報を参考にした。

stackoverflowの質問 ConfigurationManager.OpenExeConfiguration – loads the wrong file?
http://stackoverflow.com/questions/1083927/configurationmanager-openexeconfiguration-loads-the-wrong-file

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。