6

我正在开发一个应该在 Windows、Mac OS X 和 Linux 上本地运行的 GUI 桌面应用程序。在跨平台应用程序中存储首选项的首选方式是什么?我正在使用 C++,但问题(及其答案)应该对任何本机编译的语言都有效。(可以在这里看到动态语言和 Java 的解决方案。)

到目前为止,我的研究告诉我,至少有两种策略:
(A) 使用特定于操作系统的 API 首选项函数。
(B) 将首选项存储在适当的(特定于操作系统的)文件夹内的文件中。

让我们考虑方法(A):我假设NSUserDefaults是 Mac OS X 的正确方法。在 Windows 系统上,我会通过RegOpenKeyEx. 但是出现了一些问题:是否有任何可比较且可移植的 Linux API 呢?写入 Windows 注册表真的是面向未来的解决方案吗?

为了简单起见,我倾向于遵循方法(B)。因此,我只有特定于操作系统的代码来获取适当的目录,我可以在其中以我选择的格式存储我的数据。在 Windows 上,我已经学会SHGetFolderPath(或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)。

这样,您就不必关心用户数据在文件系统中的实际存储位置。您只需创建一个 Fl_Preferences 对象,该对象由应用程序的名称及其供应商(例如,“CoolApp”和“AuthorOfCoolApp”)标识,然后 Fltk 将数据存储在某处。

在 Linux 下,首选项存储在 ~/.fltk/{vendor}/{application}.prefs 中,其中 {vendor} 和 {application} 是您传递给 Fl_Preferences 构造函数的相同字符串。但你不应该担心这个。

于 2013-11-03T10:33:17.437 回答