我正在开发一个GUI桌面应用程序,应该在Windows、Mac OS X和Linux上本地运行。在跨平台应用程序中存储首选项的首选方法是什么?我正在使用C++,但问题(及其答案)对于任何本机编译语言都应该有效。(动态语言和Java的解决方案可以在此处查看。)
到目前为止,我的研究告诉我,至少有两种策略: (A) 使用特定于操作系统的API首选项函数。 (B) 将首选项存储在适当的(特定于操作系统的)文件夹中的文件中。
让我们考虑方法(A):我假设
为了简化问题,我倾向于遵循方法(B)。因此,我只需要特定于操作系统的代码来获取适当的目录,以我选择的格式存储我的数据。在Windows上,我学习到使用
总结我的问题:
1. 是否有被认为是最佳实践的模式?
2. 是否有C++类可以抽象出所有肮脏的东西,如找到正确的文件夹?(我遇到了QSetting,但我正在使用FLTK,我不想改变我的GUI工具包。) 编辑:
“偏好设置”指的是应用程序和用户可以更改的数据,例如最近文件列表、首选窗口大小等。
到目前为止,我的研究告诉我,至少有两种策略: (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,使事情变得更加复杂。最后,对于Linux版本,使用getenv("HOME")
(并将getpwuid()
作为备用解决方案)似乎是推荐的。总结我的问题:
1. 是否有被认为是最佳实践的模式?
2. 是否有C++类可以抽象出所有肮脏的东西,如找到正确的文件夹?(我遇到了QSetting,但我正在使用FLTK,我不想改变我的GUI工具包。) 编辑:
“偏好设置”指的是应用程序和用户可以更改的数据,例如最近文件列表、首选窗口大小等。