【问题标题】:Application Settings应用程序设置
【发布时间】:2010-09-17 12:47:10
【问题描述】:

什么是存储应用程序设置的相当标准的方法,主要用于 Windows,但也很容易转移到其他平台。

基本上我想要 4 组设置:

  • 全局设置,影响所有用户,并且可以在机器之间移动
  • 全局系统设置,影响所有用户,但特定于该系统(例如该系统的默认设置,例如图形选项)
  • 用户设置,在系统之间移动的用户设置(例如音量)
  • 用户系统设置,特定于该系统的用户设置(例如依赖于硬件的图形选项)

每个级别都会覆盖上一个级别,允许“全局设置”在很大程度上是应用程序的默认设置,用户设置存储用户选择的选项。 前两个基本上是没有用户设置的默认设置(例如对于新用户)。

我考虑过实现一组功能,然后我可以为不同的系统实现这些功能(可能是通过 ini 文件),但这是最好的方法吗?

(c++)

namespace config
{
    void Init(const std::string &AppName);
    //updates config for keys/sections that don't exist (ie don't overwrite changes by advanced users by rewriting the entire file)
    void Defaults          (std::map<std::string,std::map<std::string,std::string> > &Map);
    void SystemDefaults    (std::map<std::string,std::map<std::string,std::string> > &Map);

    void Set               (const std::string &Section, const std::string &Key, const std::string &Value);
    void SetSystem         (const std::string &Section, const std::string &Key, const std::string &Value);

    void SetUser           (const std::string &Section, const std::string &Key, const std::string &Value);
    void SetUserSystem     (const std::string &Section, const std::string &Key, const std::string &Value);

    std::string GetValue   (const std::string &Section, const std::string &Key);
}

我知道 windows 有一组用于此类设置的目录,但这些目录是否适合我的需要?

编辑:我宁愿使用文件(ini 或 xml),而不是使用 windows 注册表。但是,将这些配置文件放在每个操作系统下的最佳位置在哪里?

在 Vista 下我找到了这些,它们似乎适合我的群体,但是旧的 windows 版本(我需要支持 win2000、XP 等)呢,mac/linux 是否有自己的类似文件夹?

  • 全局设置 - \Users\Default\Appdata\Roaming
  • 全局系统设置 - \Users\Default\Appdata\Local
  • 用户设置 - \Users\\AppData\Roaming
  • 用户系统设置 - \Users\\AppData\Local

【问题讨论】:

    标签: c++ windows settings


    【解决方案1】:

    如果你是 boost 用户,你可以看看 program options 库,它支持使用配置文件以及环境变量和(当然)命令行选项。

    它被设计成可移植的,因此可以减轻您跨平台的烦恼。

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      有(至少)三个合理的选择:

      注册表:由于可移植性和相对不透明性,这是我最不喜欢的。

      环境变量:我建议使用一个(仅一个)指向保存材料的位置 - “安装目录”或类似的。

      文件:用户主目录(或其子目录)和项目/产品目录都适合存放东西。

      您可能希望使用简单的关键字=值范例和基本规则,以便您的变量 - 设置 - 可以很容易地被一种以上的代码读取。例如,我通常对属性文件使用 Java 范例并使用匹配行为 C 代码,因此我的两个代码行都可以轻松读取设置。

      【讨论】:

      • 文件是我的首选方式,因为同样的东西可以在所有平台上工作,而且工作量很小。主要问题是文件应该在哪里,以及如何提供一个干净的界面(例如微软没有'似乎不希望应用程序使用应用程序自己的目录中的文件...id 对 %username%.ini 感到满意)。
      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-10-10
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多