2008-08-09 8 views
42

私は新しいWindowsプログラマです。ユーザーが設定可能なアプリケーション設定をどこに保存すべきかわかりません。私はユーザーがアプリケーション設定を変更するためのユーザーフレンドリーな手段を提供する必要性を理解しています。設定フォームなど。しかし、ユーザーがそのフォームの[適用]ボタンを押した後に値を保存する必要はありますか?ユーザー設定可能なアプリケーション設定を格納するためのレジストリとINIファイル

Windowsのレジストリに設定を保存することとローカルのINIファイルや設定ファイルなどに保存することの長所と短所は何ですか?設定ファイルの

答えて

37

長所:

  1. 行うのは簡単。 Windows API呼び出しを知る必要はありません。あなたは、プログラミング言語のファイルI/Oインタフェースを知っているだけです。
  2. ポータブル。アプリケーションを別のOSに移植する場合、設定形式を変更する必要はありません。
  3. ユーザーが編集可能です。ユーザは実行中のプログラムの外部で設定ファイルを編集することができます。レジストリの

長所:

  1. セキュア。ユーザーがregeditについて知っていない限り、誤って設定ファイルを削除したり、データを破損したりすることはありません。そして、ユーザーはただのトラブルを求めています。
  2. 私は専門家のWindowsプログラマーではありませんが、レジストリを使用すると、他のWindows固有のもの(ユーザー固有の設定、グループポリシーのようなネットワーク管理など)を簡単に行うことができます。

設定情報を保存するだけの簡単な方法が必要な場合は、設定ファイルとしてINIまたはXMLを使用することをお勧めします。レジストリの使用を中止したい特定のものがある場合にのみ、レジストリを使用することをお勧めします。

+3

JSONは、今日の単純なデータファイルで広く使用されているもう1つの形式です。 – jpmc26

+2

欠けている点:新しいウィンドウを再インストールすると、iniファイルが削除されません。集中化されたデータベースをミューテックス化する必要があります。ここでは、マルチレベルのロールバック可能なトランザクションを使用してOracleの品質について語っていません。クリーナー/アンチウイルスツールは、人のレジストリを混乱させることを愛しています。レジストリはファイルシステム内のファイルシステムにすぎません。これは反パターンですhttp://en.wikipedia.org/wiki/Inner-platform_effect ... –

+1

INIファイルはより良いシステムです。成功した起動時のアプリケーションは、INIのバックアップを保存するだけで、破損を防ぐことができます。 – Mario

4

GetPrivateProfileStringのドキュメントによれば、レジストリを使用して初期化情報を保存する必要があります。

しかし、それでも.iniファイルを使用してアクセスするために標準プロファイルAPI(GetPrivateProfileStringWritePrivateProfileStringなど)を使用する場合は、自動的に「仮想」を提供する組み込みの方法を提供しますレジストリによってバックアップされた.iniファイル。 Win-Win!

4

賛否両論のいくつかをカバーする同様の質問hereがあります。

あなたのアプリケーションが絶対に必要としない限り、レジストリを使用しないことをお勧めします。私の理解から、Microsoftは設定ファイルの柔軟性のためにレジストリの使用を阻止しようとしています。また、.iniファイルを使用することはお勧めしませんが、代わりにbuilt-in functionalityの一部を.Net for user/app settingsに保存することをお勧めします。

2

私はDanielに同意します。それが大規模なアプリケーションの場合、私はレジストリ内で何かをやると思います。小さなアプリケーションで、構成フォームを作成せずにその側面をユーザーが構成できるようにしたい場合は、素早いINIファイルを入手してください。

私は通常、このような構文解析を行います(。iniファイルは、オプション=値、行あたり1である、#で始まるコメント):

static void Parse() 
{ 
    StreamReader tr = new StreamReader("config.ini"); 
    string line; 
    Dictionary<string, string> config = new Dictionary<string, string>(); 

    while ((line = tr.ReadLine()) != null) 
    { 
     // Allow for comments and empty lines. 
     if (line == "" || line.StartsWith("#")) 
      continue; 

     string[] kvPair = line.Split('='); 

     // Format must be option = value. 
     if (kvPair.Length != 2) 
      continue; 

     // If the option already exists, it's overwritten. 
     config[kvPair[0].Trim()] = kvPair[1].Trim(); 
    } 
} 

編集:申し訳ありませんが、私はあなたが言語を指定したと思いました。上記の実装はC#で行われています。

+0

[これに関する全質問](http://stackoverflow.com/questions/217902/reading-writing-ini-file-in-c)(C#の場合)があります。 – idbrii

+0

https://docs.python.org/2/library/configparser.html –

-2

あなたのアプリケーションは、セットアッププログラムと共にインストールされているものですか、それとも単に「抽出と実行」ですか?最初のケースでは、ここで概説した長所と短所を見てください。しかし、ExtractとRunのために、レジストリは私の意見では「ノー・ゴー」と言われています。人々はあなたのプログラムを取り除くために単にアプリケーションフォルダを削除できると思っています。

2

Daniel氏によると、構成データをレジストリに保存すると、管理用テンプレートを使用するオプションが与えられます。つまり、管理テンプレートを定義し、それをグループポリシーで使用し、ネットワーク全体でアプリケーションの設定を管理することができます。アプリケーションの性質によって、これは大きな恩恵になる可能性があります。

3

レジストリでINIファイルを使用するともう1つの利点があります: ユーザーがある種のボリューム/ファイルベースの暗号化を使用している場合、INIファイルがかなり簡単に暗号化されることがあります。レジストリではおそらくもっと問題になるでしょう。

22

Jeff AtwoodはWindowsのレジストリについてはarticleと素晴らしいですが、代わりに.INIファイルを使用する方が良い理由は何ですか。

私の人生は、アプリケーションごとの設定を簡単に見たり、操作したり、バックアップしたりできる場所に保存していたほうがずっと簡単です。 INIファイルのように、言います。

  • レジストリ障害の単一点です。だからこそ、レジストリ編集のヒントは、regeditでコンピュータをどうやって破壊するかについて、大きな肥満な叫び声で始まります。
  • レジストリはで、不透明でバイナリはです。アングルブラケット税は嫌いですが、少なくともXML設定ファイルは人間が読める形式であることが妥当です。
  • レジストリはファイルシステムと同期してでなければなりません。アプリケーションを「アンインストール」せずに削除すると、古いレジストリクラフトが残ってしまいます。または、アプリケーションのアンインストーラが不十分である場合ファイルシステムはもはや記録のステートメントではなく、何とかレジストリに同期させなければなりません。 DRY原則に全面的に違反しています。
  • レジストリはモノリシックです。たとえば、アプリケーションをマシン上の別のパスに移動したい場合や、別のマシンに移動する場合などです。巨大なレジストリtarballからその特定のアプリケーションの関連する設定を抽出することを幸運。特定のアプリケーションには、通常レジストリの全面に数十の設定があります。
+2

私は全く同意します。レジストリは、あなたが完全に削除することはできないガベージ・アンド・リンキー・ディンク・アプリケーションを呼び起こすだけです。 –

1

レジストリは、迅速なアクセスと簡単に更新のために最適化され、そしてそれは、拡張子に関連付けのような特定のWindows固有の物事を行うための唯一の方法ですされています。また、プログラムをアンインストールするための単一のディレクトリの削除に関する議論を無視することもできます.Windows Vistaでは、Program Filesディレクトリのファイルを変更することはできませんので、設定は別のフォルダに移動する必要があります。

Windowsプログラミングの一般的なガイドラインがあります.Microsoftが期待しているように、あなたの人生はもっと楽になるでしょう。

つまり、私はINIファイルの魅力を知ることができ、それを考慮して誰も責めることはありません。

+0

あなたはあなたのiniを%appdata%に入れることになっています。 –

4

アプリケーションと同じディレクトリにあるiniファイルを使用すると、アプリケーションでバックアップすることができます。したがって、OSをリロードした後、アプリケーションディレクトリを復元するだけで、必要な設定を自分のものにすることができます。

-1

iniファイルまたはconfigファイルには欠点が1つあり、ユーザーがプログラムのインストール先を選択するオプションがある場合は、そのファイルを見つけることができます。

+1

exeと同じディレクトリに置きます。 argv [0]からexeディレクトリを引き出します。 – EvilTeach

+0

argv [0]に依存することはできません。絶対パス、相対パス、完全空、または完全に間違っている可能性があります(たとえば、プロセスがexec *を使用して起動されている場合など)。最初のパラメータがNULLのGetModuleFileNameを使用し、PathCanonicalizeの後に無関係のパス要素を削除します。 – syplex

+0

...そしてそれもシンボリックリンクになる可能性があるので完璧ではありません。 'GetFinalPathNameByHandle'を使ってそれを終わらせる必要があります。 –

1

既存の回答には多大な支障がありますが、私はもう1つの点について言及しています。

システム全体の設定を保存するために、レジストリを使用します。つまり、2つ以上のプログラムがまったく同じ設定を必要とする場合です。言い換えると、いくつかのプログラムによって共有される設定です。

他のすべてのケースでは、実行可能ファイルと同じパスまたは(Configurationディレクトリ内の)1つ下のレベルのいずれかにあるローカル構成ファイルを使用します。理由はすでに他の回答(ポータブル、テキストエディタなどで編集可能)でカバーされています。

なぜシステム全体の設定をレジストリに入れるのですか?まあ、私は設定が共有されているが、ローカルの設定ファイルを使用する場合は、設定を複製することを発見した。これにより、複数の場所で設定を変更する必要が生じる可能性があります。

例えば、プログラムAとプログラムBの両方が同じデータベースを指しているとします。接続文字列の "システムワイド"レジストリ設定を行うことができます。別のデータベースを参照する場合は、接続文字列を1か所で変更することができ、両方のプログラムが他のデータベースに対して実行されるようになります。

注 - 2つ以上のプログラムで同じ値を使用する必要がない場合は、この方法でレジストリを使用する必要はありません。プログラムAとプログラムBの両方で、データベース接続文字列が必要なのは、ですが、必ずしもそうではありません。たとえば、プログラムBはテストデータベースを使用しますが、プログラムAは本番データベースを使用して実行する必要があります。

上記の例では、一部のローカル設定をシステム全体の設定より優先させることができますが、単純な作業では過度に複雑になることがあります。

+0

これは私が言いたいことです。私がインストールの一環としてchromeまたはfirefoxに拡張機能を追加したいのであれば、chrome/firefoxが見つけることを期待するレジストリエントリを追加する方法があります。これは、プラグイン/ヘルパーなどとしていくつかのアプリに登録する場合にも当てはまります。他のアプリはIPCが動作しない時には動作していない可能性があります。また、アプリを検索する場合、使用されているバージョンかバックアップかわかりません。レジストリはここに行く方法です。 –

関連する問題