我正在开发一个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
(或SHGetKnownFolderPath
了解最近的Windows系统),CSIDL_LOCAL_APPDATA
是可行的方法。在Mac上,NSSearchPathForDirectoriesInDomains
API调用也应该这样做;虽然使事情变得更复杂,但它是一个Objective-C API。最后,对于使用getenv("HOME")
(和getpwuid()
作为后备解决方案)的Linux版本,似乎是值得推荐的。
总结我的问题:
1.是否有任何模式被视为此任务的最佳实践?
2.是否有任何C ++类抽象出所有脏东西,比如在那里找到正确的文件夹? (我遇到QSetting,但我正在使用FLTK,我不想更改我的GUI工具包。)
修改
“偏好”是指可由应用程序和用户改变的数据,例如,最近文件列表,首选窗口大小等。
答案 0 :(得分:1)
我也正在开发一套跨平台的插件,并完全按照你在方法(B)中描述的那样:
我还要注意:
~/Library/Preferences
文件夹,而是使用他们的API来保存偏好值。实际上,这会将首选项转换为注册表之类的机制。我非常反感这种做法。我不知道任何以跨平台方式实现查找currect文件夹的库。正如您所描述的,使用SHGetKnownFolderPath和NSSearchPathForDirectoriesInDomains写这样的函数并不是很难。
答案 1 :(得分: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构造函数的相同字符串。但你不应该担心这一点。