我正在开发一个应该在 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 上,NSSearchPathForDirectoriesInDomains
API 调用应该做同样的事情;它是一个 Objective-C API,虽然让事情变得更复杂。最后,对于 Linux 版本,使用getenv("HOME")
(并getpwuid()
作为后备解决方案)似乎是推荐的。
总结一下我的问题:
1. 是否有任何模式被认为是该任务的最佳实践?
2. 是否有任何 C++ 类抽象出所有脏东西,比如在外面找到正确的文件夹?(我遇到了QSetting,但我正在使用 FLTK 并且我不想更改我的 GUI 工具包。)
编辑:
“首选项”是指可能由应用程序和用户更改的数据,例如最近文件列表、首选窗口大小等。