存储设置的最佳做法

Sim*_*mon 11 c++ settings visual-c++

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

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

我想拥有以下"功能":

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

据我所知,在Windows上存储设置有3种可能性:

  • 注册处
  • Ini文件
  • XML文件

我们套件中只有一个应用程序目前使用Qt,但Boost可用.

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

Dre*_*ann 5

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

Boost的property_tree是一个绝佳的选择,因为它经过了充分的测试,可以轻松导出为XML或JSON。

关于您的要求:

  • 设置可以版本化

是! 将“版本”设置为顶级键。使其易于与其他版本进行比较。

您还可以将设置分类到各个树节点中,并为每个节点提供一个版本。

  • 在目标机器上的简单更新(可由用户完成)

让您的应用程序在运行时执行此操作。见下文。

  • 确保更新时仅添加新设置,并且不使用默认值覆盖现有设置
  • 简单更改用户设置
  • 在Win XP和Win 7下相同的工作流程

随着设置从一个版本更改为另一个版本,通常这些更改分为三类。需要新属性,废弃旧设置,并且某些设置会更改其预期格式。例如,“ 32华氏度”变为“ 0摄氏度”

应用程序初始化时:

  • 加载现有配置文件,而不考虑其版本。
  • 如果版本与应用程序当前版本不匹配:
    • 为新配置创建新的空白属性树
    • 对于树中的每个节点,请具有一组预期的属性名称,以及一个函数指针或类似名称(如果旧文件的树中不存在此设置)以获取此设置。如果设置更改了格式,请给它起一个新名称。
    • 搜索旧树中的每个设置,如果找到,则将其复制;否则,使用提供的函数的结果。
    • 保存新的设置文件。

您的“缺少设置”功能可以:

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