2012-06-25 81 views
7

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

有时这很不方便,因为用户在更改注册表中的条目时遇到困难。我想设置版本,所以设置总是匹配当前的代码。目前我们版本的reg文件,但你永远不知道,如果所有reg文件已被添加到目标机器上。使用C#,您可以在app.config中定义默认值,但不要覆盖现有设置。我不知道,如果这样的机制或库存在C++。

我想有下面的“功能”:

  • 设置可以版本在目标计算机上
  • 简单的更新(可以由用户完成)
  • 确保在更新只新设置被添加并且没有现有设置被覆盖默认值
  • 简单更改用户设置
  • Win XP和Win 7下的相同工作流程

至于我看到,有3种可能性来存储Windows设置:

  • 注册
  • INI文件
  • XML文件中,只有

一个应用我们套件目前使用Qt,但Boost将可用。

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

+2

我建议其他替代方案:YAML/JSON的人可读格式,用于简单嵌入的SQLite。关于'ini'文件,你可能会对[如何用Boost解析ini文件]感兴趣[(http://stackoverflow.com/questions/6175502/how-to-parse-ini-file-with-boost))。 –

+0

+1为Boost/ini文件,如果你可以KI那个SS。 – DevSolar

+0

如果你需要多层包含,我会去XML/JSON文件。否则,INI可能是最简单的解决方案。 – Morwenn

回答

3

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

Boost's property_tree是一个很好的选择,因为它是良好测试并且可以容易地导出为XML或JSON

关于您的要求:

  • 设置可以版本

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

您还可以将您的设置分类到各种树节点并为每个节点分配一个版本。在目标计算机上

  • 简单的更新(可根据用户来完成)

让你的应用程序一样,它运行时。见下文。

  • 确保在更新时只添加新的设置,并没有现成的设置与默认值覆盖
  • 的设置,用户
  • 简单的变化
  • 在Win XP和Win 7
  • 相同的工作流程

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

当你的应用程序初始化:

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

你 “失踪设置” 功能可以:

  • 返回一个常量默认值。
  • 查询树为不同的设置,并将其转换(用默认值,如果旧的设置还是没有被找到)
  • 询问用户
相关问题