找回密码
 立即注册
收起左侧

KS04-14 配置文件-INI格式

0
回复
4438
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2019-7-2 17:03:52 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2019-7-2 20:36 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------

网页版课程源码 提取码:1uy7
引言
------------------------------------------------------------------------------------
在前面的章节中,我们介绍了XML格式配置文件的读写。通过练习我们可以知道,其实XML格式的配置文件的扩展性很好,但是编程不太容易,因为不同的XML配置文件可能文件的结构不完全一样,那么我们可能无法用一套代码访问这些配置文件。但是INI格式的配置文件就不同了,它的格式相抵固定,也具备一定的扩展性,本节我们就来看一下INI格式配置文件的设计与访问。

正文
------------------------------------------------------------------------------------
我们先来看一个INI格式的配置文件样例:
param.ini


  1. [system]
  2. alarm = N
  3. splash = Y
  4. [css]
  5. background_color = rgb(255, 0, 0)
  6. bakground_image=bk_gnd.png
复制代码

可以看出,INI格式配置文件实际是分为不同的主键(group),比如上述示例的"system"、"css"。每个组下面可以添加多个子键的键值对。这就构成了INI格式配置文件。
对于这种相对固定的格式,我们就可以进行编写固定程序来访问它。本节的主要内容并不在于如何实现INI格式文件的访问,而是它的访问接口的设计。为了简单起见,我们的INI格式配置文件访问类中用到了QString,因此可能不适合服务类模块调用。
我们提供的示例中,INI配置文件访问类名称为CIniConfig。
首先,我们提供接口用来设置ini文件名:

  1. /*
  2.     * @brief 设置配置文件的文件名,使用全路径,不支持环境变量.
  3.     * @param[in] strFileName 文件名
  4.     * @return true:成功,false:失败
  5.     */
  6.         bool  setFileName(const QString& strFileName);
复制代码


接着就是访问配置项的接口定义,我们提供了boolean、int、double、string类型的定义。因为这些接口类似,所以我们选区boolean类型的接口来介绍。
  1. /**
  2.         * @brief 读取bool类型的键值
  3.         * @param[in] strKey 主键
  4.         * @param[in] strSubKey 子键
  5.         * @param[in] i_nDefault 默认值
  6.         * @param[out] o_bRet true:成功, false:失败
  7.         * @return 数据
  8.         */
  9.         bool  getBoolean(const QString& strKey, const QString& strSubKey, bool i_nDefault, bool* o_bRet = NULL);
复制代码

为了解释这个接口,我们来看下面的ini样例:

  1. [system]
  2. alarm = N
  3. splash = Y
  4. [css]
  5. background_color = rgb(255, 0, 0)
  6. bakground_image=bk_gnd.png
复制代码

在getBoolean()接口中,第一个参数是主键,相当于ini文件中的的"system";第二个参数是子键,相当于ini文件中的"alarm"和"splash";第三个参数是默认值;最后一个参数用来返回接口调用的结果,如果调用者传入了有效地址,当所查询的配置项存在时,o_bRet地址中将被写入true,否则写入false。为了方便,查询到的配置直接以函数返回值的方式传递给调用者。
我们再来看一下set接口。
  1. /**
  2.         * @brief 设置bool类型的键值
  3.         * @param[in] strKey 主键
  4.         * @param[in] strSubKey 子键
  5.         * @param[in] i_nValue 子键的值
  6.         * @return true:成功, false:失败
  7.         */
  8.         bool  setBoolean(const QString& strKey, const QString& strSubKey, bool i_nValue);
复制代码


如上述代码所示,setBoolean()接口更简单,前两个参数分别表示主键和子键,第三个参数表示新的配置项的值。
为了方便,我们还提供了增删配置项的接口。
  1. /**
  2.      * @brief 删除全部键值
  3.      * @return true:成功,false:失败
  4.      */
  5.         bool  deleteAllKeys();
  6.   /**
  7.   * @brief 删除指定主键
  8.     * @param[in] strKey 主键
  9.     * @return true:成功,false:失败
  10.     */
  11.         bool  removeKey(const QString& strKey);        
  12.         /**
  13.     * @brief 删除指定子键
  14.     * @param[in] strKey 主键
  15.     * @param[in] strSubKey 子键
  16.     * @return true:成功,false:失败
  17.     */
  18.         bool  removeSubKey(const QString& strKey, const QString& strSubKey);
复制代码


上面三个接口分别用来删除所有主键(子键会级联删除)、删除指定主键、删除指定子键。
另外,该类还提供了如下接口:
  1. /**
  2.     * @brief 读取键值列表, ,比如传入("config""),得到, "x=xx\ny=yy\nz=zz"
  3.     * @param[in] strKey 主键
  4.     * @return 键值列表
  5.     */
  6.     QString getAllKeys(const QString& strKey);

  7.     /**
  8.     * @brief 设置键值列表, ,比如传入("config", "x=xx\ny=yy\nz=zz")
  9.     *           执行后的结果:
  10.     *           [config]
  11.     *           x=xx
  12.     *           y=yy
  13.     *           z=zz
  14.     * @param[in] strKey 主键
  15.     * @param[in] str 子键值值列表,\n分隔。比如: "x=xx\ny=yy\nz=zz"  
  16.     * @return 结果,true:成功, false:失败
  17.     */        
  18.     bool setAllKeys(const QString& strKey, const QString& Str);
复制代码


其中,getAllKeys()接口用来获取某个主键的子键值对列表。setAllKeys()接口用来设置指定主键的子键值对列表。
在示例代码中,我们对主要的接口进行了演示。请大家对照demo进行调试练习。
结语
------------------------------------------------------------------------------------
  因为其简便易用的特性,ini格式的配置文件在软件研发中广泛使用。但是表面上来看,ini格式的配置文件仅支持两级(主键+子键),不像XML格式的配置文件那样理论上可以支持无限级别。实际上,我们可以通过扩展子键的键值对的含义来使得ini格式的配置也像XML格式那样拥有一定的扩展性。比如我们把子键值对的值设计成下面的样子:

  1. [config]
  2. cfg = [a/b/c],[a/e/f]
复制代码


在上面的ini配置文件中,cfg的值是一个用","分割的多个数值的组合,使用者可以在读取到该值后自行解析。这个cfg的设计就有一定的扩展性。
除了存取配置之外,我们还会将内存中的对象或数据序列化到文件中,以便下次重新启动时可以继续使用上次的断面,这些内容我们将在后面的章节为大家介绍。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了