存储设置的最佳做法

时间:2012-06-25 07:30:11

标签: c++ visual-c++ settings

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

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

我想拥有以下“功能”:

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

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

  • 注册表
  • Ini档案
  • XML文件

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

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

1 个答案:

答案 0 :(得分:4)

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

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

关于您的要求:

  
      
  • 可以对设置进行版本控制
  •   

是的!使“版本”成为顶级密钥。使其与其他版本轻松相媲美。

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

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

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

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

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

当您的应用程序初始化时:

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

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

  • 返回一个常量默认值。
  • 查询树以获取其他设置并进行转换(如果未找到旧设置,则使用默认值)
  • 询问用户