应用程序设置

Application Settings

本文关键字:设置 应用程序      更新时间:2023-10-16

存储应用程序设置的一种相当标准的方式是什么,主要用于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有自己的simelar文件夹吗?

  • 全局设置-<SYSDRIVE>\Users\Default\Appdata\漫游
  • 全局系统设置-<SYSDRIVE>\Users\Default\Appdata\Local
  • 用户设置-<SYSDRIVE>\用户\<用户>\AppData\漫游
  • 用户系统设置-<SYSDRIVE>\用户\<用户>\AppData\Local

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

它被设计为可移植的,因此应该可以缓解跨平台的头痛。

另请参阅跨平台应用程序应该在哪里保存数据?

至少有三种合理的选择:

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

环境变量:我建议使用一个(只有一个)指向保存材料的地方——"安装目录"或类似的东西。

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

您可能想要使用一个简单的keyword=value范式和基本规则,这样您的变量-设置-就可以很容易地被多种类型的代码读取。例如,我通常对属性文件使用Java范式,并使用匹配的行为C代码,这样我的两个代码行都可以轻松地读取设置。