简介
基于 key-value 的配置文件被广泛得到应用,为了便于操作,如配置文件 config.ini
有以下内容:
[System]
Encoding=UTF-8
BatchNumber=50
Version=4.4
OutputPath=C:\FILES
LastTime=2019/05/23 04:29:35
[Others]
LastTime=2019/05/22 10:22:54
配置文件分为不同的段,段与段之间使用[段名]
进行分隔,可以通过 System.BatchNumber
作为 key 获得对应的值为 50
。不同的段可以有相同的变量名,如 System.LastTime
和 Others.LastTime
。
为了便于读写,特编写了一个用于此操作的类 Windgoes.Data.ConfigAccess
。它是一个基于字符串的用于简单的配置参数记录的的类。提供了基于(key, value) 方式的读写方法,同时数据也可以向文件中做持久化。
约定
为了保证通用性,本类对配置文件的格式做出以下约定:
- 配置文件以段进行划分,每个段有多个 key-value 项;
- 段名的格式为
[$段名]
, 其中$段名
为字母、数字和下划线组成,如[System]
,[Part_1]
,[Others]
; - 每个 key 都有唯一对应的段名,其中段名格式 为字母、数字和下划线组成;
- key和value使用等号连接,key 左右的空格会被删除,value中可以包括等于号;
- key 和段名使用点(.) 连接,如
System.Encoding
,如果key中不包括点,则会被当成默认段Others
来处理,如Encoding
会被当成Others.Encoding
来处理; - 一个包括段名的主键中,只有一个点号;
- 如果在同一个文件中相同的 key 出现多次,取第一次出现的值,忽略后面的值;
- value 的内容无限制,最小长度为0;
- 以 # 或 // 头的行会被当成注释而会忽略;
- value中的换行符(即
/n
)会被替换为一个长度为15的特殊字符串,从而保证在换行时不受影响。 - 配置文件默认使用 Encoding.UTF8 进行编码。
- 每个 GetXXX 函数(如
GetDateTime
) 包括 GetXXX(section, key, defaultValue) 和 GetXXX(key, defaultValue) 两个函数。如果不写段名,默认段名为Others
。 - 即便在调用
GetXXX(section, key, defaultValue)
时,仍然写了全名,如GetDateTime("Others", "System.LastTime", DateTime.Now)
,程序会根据名称中已经包括了.
而按照System.LastTime
来处理,而不是简单相加成Others.System.LastTime
。
主要方法
// 初始化
ConfigAccess ca = new ConfigAccess("config.ini")
// 保存数据:
ca.Save();
// 写入数据
ca.SetValue("System.LastDate", "2019/05/23 04:29:35");
// 移除key,成功返回 true, 失败返回 false
ca.Remove(key);
// 读取数据
ca.GetString(key); // 读取 字符串,失败时返回为空。
/************ 读取 double 类型 ************/
// 读取键值为key的数据并转换为 double, 失败返回为 double.NaN
ca.GetDouble(key);
// 读取键值为key的数据并转换为 double, 失败返回为 -0.1
ca.GetDouble(key, -0.1);
// 读取键值为 section.key 的值并转换为 double, 失败返回为 double.NaN
ca.GetDouble(section, key, double.NaN);
// 注:除了 GetDouble 方法,还提供了一系列的 GetXXX 的方法用于获得不同数据的转换,
// 如 GetInt, GetFloat, GetDateTime 等等。
// 保存数据
ca.Save();
支持保存的数据类型
- string
- int
- float
- double
- bool
- DateTime
- 可序列化的繁杂数据类型
源代码
ConfigAccess 类参见:https://gitee.com/hwaust/WindGoes6/blob/master/Windgoes6/Data/ConfigAccess.cs
ConfigItem 类参见:https://gitee.com/hwaust/WindGoes6/blob/master/Windgoes6/Data/ConfigItem.cs