c – 如何在跨平台应用程序中存储首选项(和用户设置)?

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

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

让我们考虑方法(A):我认为NSUserDefaults是Mac OS X的正确方法.在Windows系统上,我通过RegOpenKeyEx写入注册表.但是出现了一些问题:是否有可比的便携式Linux API?写入Windows注册表真的是一个面向未来的解决方案吗?

为了简单起见,我倾向于遵循方法(B).因此,我只有特定于操作系统的代码来获取适当的目录,我可以以我选择的格式存储我的数据.在Windows上,我已经学习了SHGetFolderPath(或者用于最近的Windows系统的SHGetKnownFolderPath),CSIDL_LOCAL_APPDATA是可行的方法.在Mac上,NSSearchPathForDirectoriesInDomains API调用也应该这样做;虽然使事情变得更复杂,但它是一个Objective-C API.最后,对于使用getenv(“HOME”)(和getpwuid()作为后备解决方案)的Linux版本似乎是值得推荐的.

总结一下我的问题:
1.是否有任何模式被认为是此任务的最佳实践?
2.是否有任何C类抽象出所有脏东西,比如找到正确的文件夹? (我遇到了QSetting,但我正在使用FLTK而且我不想更改我的GUI工具包.)

编辑:
“偏好”是指可由应用程序和用户改变的数据,例如,最近文件列表,首选窗口大小等.

最佳答案 我也正在开发一套跨平台插件,并完全按照你在方法(B)中描述的那样:

>使用平台特定代码查找正确的文件夹.
>使用跨平台代码将首选项写入该文件夹.

我还要注意:

>使用Windows注册表是非常有限和有问题的.我尽量避免这种情况.
>最近苹果有一首新歌:你不应该直接访问〜/ Library / Preferences文件夹,而是使用他们的API来保存偏好值.实际上,这会将首选项转换为注册表之类的机制.我非常反感这种方法.

我不知道任何实现以跨平台方式查找currect文件夹的库.正如您所描述的,使用SHGetKnownFolderPath和NSSearchPathForDirectoriesInDomains写这样的函数并不是很难.

点赞