6

私は、Windows、Mac OS X、および Linux でネイティブに実行される GUI デスクトップ アプリケーションに取り組んでいます。クロスプラットフォーム アプリケーションで設定を保存するための推奨される方法は何ですか? 私は C++ を使用していますが、質問 (およびその回答) は、ネイティブにコンパイルされた言語に対して有効である必要があります。(動的言語と Java のソリューションについては、こちらを参照してください。)

私のこれまでの調査によると、少なくとも 2 つの戦略があることがわかりました。
(A) OS 固有の API 設定関数を使用します。
(B) 適切な (OS 固有の) フォルダー内のファイルに設定を保存します。

方法 (A) を考えてみましょう:NSUserDefaultsが Mac OS X の正しい方法だと思います。Windows システムでは、RegOpenKeyEx. しかし、いくつかの疑問が生じます: それに匹敵する移植可能な Linux API はありますか? Windows レジストリへの書き込みは本当に将来性のあるソリューションですか?

物事を単純にするために、私は方法 (B) に従う傾向があります。したがって、選択した形式でデータを保存できる適切なディレクトリを取得するための OS 固有のコードしかありません。SHGetFolderPathWindows については、 (またはSHGetKnownFolderPath最近の Windows システムについては)学習済みでCSIDL_LOCAL_APPDATAあり、進むべき道です。Mac では、NSSearchPathForDirectoriesInDomainsAPI 呼び出しで同じことを行う必要があります。物事をより複雑にしていますが、これは Objective-C API です。最後に、Linux バージョンではgetenv("HOME")(およびgetpwuid()フォールバック ソリューションとして) を使用することをお勧めします。

私の質問を要約すると:
1. このタスクのベスト プラクティスと見なされるパターンはありますか?
2. 正しいフォルダを見つけるなど、すべての汚れを抽象化する C++ クラスはありますか? (私はQSettingに遭遇しましたが、私は FLTK を使用しており、GUI ツールキットを変更したくありません。)

編集:
「設定」とは、アプリケーションとユーザーによって変更される可能性のあるデータを意味します。たとえば、最近のファイルのリスト、優先ウィンドウサイズなどです。

4

2 に答える 2

2

私はクロスプラットフォームプラグインのセットも開発しており、方法(B)で説明したことを正確に行いました:

  1. プラットフォーム固有のコードを使用して適切なフォルダーを見つけます。
  2. クロスプラットフォーム コードを使用して、そのフォルダーに設定を書き込みます。

また、次のことにも注意してください。

  1. Windows レジストリの使用は非常に制限されており、問題があります。私はそれをできるだけ避けるようにしています。
  2. 最近、アップルは新しい曲を持っています:~/Library/Preferencesフォルダに直接アクセスするのではなく、設定値を保存するために API を使用する必要があります。事実上、これは設定をレジストリのようなメカニズムに変えます。私はこのアプローチに非常に憤慨しています。

クロスプラットフォームの方法で現在のフォルダーを見つけることを実装するライブラリを知りません。あなたが説明したように、そのような関数はSHGetKnownFolderPathとNSSearchPathForDirectoriesInDomainsを使って書くのはそれほど難しくありません。

于 2013-10-31T12:05:00.247 に答える
1

z80crew は自分のプロジェクトで Fltk を使用していると言っているので、少量のユーザー データを格納する最善の方法は、Fltk Fl_Preferences クラスを使用することだと思います。( http://www.fltk.org/doc-1.3/classFl__Preferences.html )。

そうすれば、ユーザー データが実際にファイル システムのどこに格納されているかを気にする必要がなくなります。アプリケーションの名前とそのベンダー (「CoolApp」や「AuthorOfCoolApp」など) で識別される Fl_Preferences オブジェクトを作成するだけで、Fltk がデータをどこかに保存します。

Linux では、プリファレンスは ~/.fltk/{vendor}/{application}.prefs に保存されます。{vendor} と {application} は、Fl_Preferences のコンストラクターに渡した文字列と同じです。しかし、あなたはそれについて心配するべきではありません。

于 2013-11-03T10:33:17.437 に答える