1. 需求描述
类的位置: https://gitee.com/hwaust/WindGoes6/blob/master/Windgoes6/Utils/ConfigHelper.cs
软件中有大量的配置信息,需要在启动时加载,同时在修改后要能够进行保存。
在Windows平台进行配置读取时,通常使用系统提供的系统提供的ini的读取API:
[DllImport("kernel32")]
private static extern bool GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
[DllImport("kernel32")]
private static extern bool WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);
使用这两个函数进行进行文件读取,具有以下问题:
- 每次都要读写都需要多个参数,不易于使用;
- 函数执行时实际上需要遍历整个配置文件,IO性能比较差;
另外,记录通用使用字典表示,即使用key-value表示,这也会存在问题:
- key通常是由字符串表示的,而字符串编码是是不验证的,所以可能会导致出错;
- value通常也是字符串,所以也会有转换的问题。
为解决以上问题,特编写此类。
2. 基本原理
由于配置文件都不大,所以可以:
- 在读取时,加载→读取,即先全部加载一次,然后内存不逐一获取相关属性;
- 在保存时,修改→保存,先在内存中修改相关字段,然后一次性保存全部内容。
3. 使用方法
WindGoes6.Utils
配置文件是文本文件,对后缀名没有要求,推荐以 *.cfg 为后续名。
3.1. 初始化
常用的初始化有两种:构造函数和静态方法。
无论使用哪种方法,如果加载失败,不会报错,只是会返回一个非空但键值数量为0的对象。
3.1.1. 构造函数法
var ch = new ConfigHelper("system.cfg");
3.1.2. 静态方法
var ch = ConfigHelper.Load("system.cfg");
3.2. 使用示例
3.2.1. 读写示例
static void ConfigHelperTest()
{
// 直接初始化一个新对象。
var dict = new ConfigHelper("config.dict");
// 也可以从一个文件中初始化。dict = ConfigHelper.Load("config.dict");
// 读取值,两种方式,具体可以对比v5和v6
var v1 = dict.GetInt(cf.port, 0);
var v2 = dict.GetFloat(cf.Temperature, 0);
var v3 = dict.GetDouble(cf.TestValue, 0);
var v4 = dict.GetDateTime("LastUpdateTime");
var v5 = dict.GetBoolean(cf.ShowConfig);
var v6 = dict[cf.ShowConfig];
Console.WriteLine($"v1={v1},\ttype={v1.GetType().Name}");
Console.WriteLine($"v2={v2},\ttype={v2.GetType().Name}");
Console.WriteLine($"v3={v3},\ttype={v3.GetType().Name}");
Console.WriteLine($"v4={v4},\ttype={v4.GetType().Name}");
Console.WriteLine($"v5={v5},\ttype={v5.GetType().Name}");
Console.WriteLine($"v6={v6},\ttype={v6.GetType().Name}\n");
// 设置值,有以下两种方式
// 方式1:直接使用字符串赋值
dict["Name"]="Jack";
dict[cf.port] = 10082 + "";
// 方式2:使用SetValue方式
dict.SetValue("FinalValue", 15.232);
dict.SetValue("CurrentDate", DateTime.Now);
// 输出为配置文件
Console.WriteLine(dict.ToCSharpString() + "\n");
// 保存为config.dict
dict.Save("config.dict");
}
3.2.2. 结果输出
v1=10082, type=Int32
v2=39.2, type=Single
v3=192.5322, type=Double
v4=2021/10/15 15:35:22, type=DateTime
public class cf
{
public static string ip = "ip";
public static string port = "port";
public static string user = "user";
public static string pwd = "pwd";
public static string mapping1 = "mapping1";
public static string mapping2 = "mapping2";
public static string Name = "Name";
public static string LastUpdateTime = "LastUpdateTime";
public static string Temperature = "Temperature";
public static string TestValue = "TestValue";
public static string ShowConfig = "ShowConfig";
}
4. 小结
略。