我有一个相当大的 C++ 应用程序(在 Windows 上,没有计划其他平台),它当前将所有设置(甚至是某种地址)存储在 Windows 注册表中。
有时这很不方便,因为用户很难更改注册表中的条目。我想对设置进行版本控制,以便设置始终与当前代码匹配。目前我们对 reg 文件进行版本控制,但您永远无法确定是否所有 reg 文件都已添加到目标机器上。使用 C#,您可以在 app.config 中定义默认值,但不要覆盖现有设置。我不知道 C++ 是否存在这样的机制或库。
我希望有以下“特征”:
- 可以对设置进行版本控制
- 目标机器上的简单更新(可由用户完成)
- 确保更新时只添加新设置,没有现有设置被默认值覆盖
- 用户设置的简单更改
- Win XP 和 Win 7 下的相同工作流程
据我所知,在 Windows 上存储设置有 3 种可能性:
- 注册表
- 配置文件
- XML文件
目前我们套件中只有一个应用程序使用 Qt,但 Boost 将可用。
对于地址,我们会将它们放在某种 XML 地址簿中,但对于其他设置我们不确定,最佳做法是什么。
最佳答案
正如评论中提到的,基于树的键/值结构是一种常见的解决方案,并且库很容易找到。
Boost's property_tree是一个很好的选择,因为它经过充分测试并且可以轻松导出为 XML 或 JSON
关于您的要求:
- Settings can be versioned
是的!使“版本”成为顶级键。使其易于与其他版本进行比较。
您还可以将您的设置分类到各种树节点中,并为每个节点指定一个版本。
- Simple update on target machines (can be done by user)
让您的应用程序在运行时执行此操作。见下文。
- Ensure that on update only new settings are added and no existing settings are overwritten with default values
- Simple change of settings for user
- Same workflow under Win XP and Win 7
随着设置从一个版本更改为另一个版本,通常这些更改分为三类。需要新的属性,旧的设置被放弃,一些设置改变了它们的预期格式。例如。 “32华氏度”变成“0摄氏度”
当您的应用程序初始化时:
- 加载现有配置文件,无论其版本如何。
- 如果版本与应用程序的当前版本不匹配:
- 为新配置创建一个新的空白属性树
- 对于树中的每个节点,都有一组预期的属性名称,以及一个函数指针或类似的函数指针,如果它在旧文件的树中不存在,则可以获取此设置。如果设置更改了格式,请为其命名。
- 在旧树中搜索每个设置,如果找到则复制它,如果没有找到则使用提供的函数的结果。
- 保存您的新设置文件。
您的“缺失设置”功能可以:
- 返回一个常量默认值。
- 查询树的不同设置并转换它(如果旧设置也未找到,则使用默认值)
- 询问用户
关于c++ - 存储设置的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11185131/