存储设置的最佳实践 我有一个相当大的C++应用程序(在Windows上,没有其他平台被计划),它目前在Windows注册表中存储所有设置(甚至某种类型的地址)。

存储设置的最佳实践 我有一个相当大的C++应用程序(在Windows上,没有其他平台被计划),它目前在Windows注册表中存储所有设置(甚至某种类型的地址)。,c++,visual-c++,settings,C++,Visual C++,Settings,有时这很不方便,因为用户很难更改注册表中的条目。我希望对设置进行版本控制,以便设置始终与当前代码匹配。目前我们正在对reg文件进行版本设置,但您永远无法确定是否已在目标计算机上添加了所有reg文件。使用C#可以在app.config中定义默认值,但不要覆盖现有设置。我不知道,如果C++存在这样的机制或库, 我希望有以下“特点”: 可以对设置进行版本控制 目标机器上的简单更新(可由用户完成) 确保在更新时仅添加新设置,并且不使用默认值覆盖现有设置 简单更改用户的设置 Win XP和Win 7下的

有时这很不方便,因为用户很难更改注册表中的条目。我希望对设置进行版本控制,以便设置始终与当前代码匹配。目前我们正在对reg文件进行版本设置,但您永远无法确定是否已在目标计算机上添加了所有reg文件。使用C#可以在app.config中定义默认值,但不要覆盖现有设置。我不知道,如果C++存在这样的机制或库,

我希望有以下“特点”:

  • 可以对设置进行版本控制
  • 目标机器上的简单更新(可由用户完成)
  • 确保在更新时仅添加新设置,并且不使用默认值覆盖现有设置
  • 简单更改用户的设置
  • Win XP和Win 7下的相同工作流
在我看来,有3种可能在Windows上存储设置:

  • 登记处
  • Ini文件
  • XML文件
目前,我们套件中只有一个应用程序使用Qt,但是Boost是可用的


对于地址,我们将把它们放在某种XML通讯簿中,但对于其他设置,我们不确定最佳做法是什么。

如评论所述,基于树的键/值结构是一种常见的解决方案,而且很容易找到库

是一个很好的选择,因为它经过了良好的测试,可以轻松地导出为XML或JSON

关于您的要求:

  • 可以对设置进行版本控制
对!!使“version”成为顶级键。使其易于与其他版本进行比较

您还可以将设置分类为不同的树节点,并为每个节点提供一个版本

  • 目标机器上的简单更新(可由用户完成)
让您的应用程序在运行时执行此操作。见下文

  • 确保在更新时仅添加新设置,并且不使用默认值覆盖现有设置
  • 简单更改用户的设置
  • Win XP和Win 7下的相同工作流
随着设置从一个版本更改到另一个版本,这些更改通常分为三类。需要新属性,放弃旧设置,某些设置更改其预期格式。例如,“32华氏度”变为“0摄氏度”

应用程序初始化时:

  • 加载现有配置文件,无论其版本如何
  • 如果版本与应用程序的当前版本不匹配:
    • 为新配置创建新的空白属性树
    • 对于树中的每个节点,都有一组预期的属性名,如果旧文件的树中没有此设置,则有一个函数指针或类似的设置。如果设置更改了格式,请为其指定新名称
    • 搜索旧树中的每个设置,如果找到,则复制它,如果没有找到,则使用提供的函数的结果
    • 保存新的设置文件
您的“缺少设置”功能可以:

  • 返回一个常量默认值
  • 查询树中的其他设置并将其转换(如果未找到旧设置,则使用默认值)
  • 询问用户

我建议其他替代方案:YAML/JSon用于人类可读格式,SQLite用于简单嵌入式格式。关于
ini
文件,如果您可以使用该SS,您可能会对.1表示Boost/ini文件感兴趣。如果您需要多层包含,我会选择XML/JSON文件。否则,INI可能是最简单的解决方案。使用注册表是一个维护噩梦。谢谢您的输入,但是我的需求呢#3?