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);

使用这两个函数进行进行文件读取,具有以下问题:

  1. 每次都要读写都需要多个参数,不易于使用;
  2. 函数执行时实际上需要遍历整个配置文件,IO性能比较差;

另外,记录通用使用字典表示,即使用key-value表示,这也会存在问题:

  1. key通常是由字符串表示的,而字符串编码是是不验证的,所以可能会导致出错;
  2. 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. 小结

略。

results matching ""

    No results matching ""