.NET平台开源项目速览(1)SharpConfig配置文件读写组件
在.NET平台日常开发中,读取配置文件是一个很常见的需求。以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲。不知道大家有没有同感。所以更多时候我还是喜欢使用开源的东西,更加方便简洁,也稳定。省去自己的麻烦。今天就介绍一个非常精致的.NET平台开源的操作配置文件(cfg/ini)的组件SharpConfig。走过路过,千万不要错过!上周我在这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧一文中也介绍过项目。我将会重点对部分开源项目进行深入的研究,形成“.NET平台开源项目速览”系列文章,该系列文章没有时间限制,会一直持续更新下去。
.NET开源目录:【目录】本博客其他.NET开源项目文章目录
本文原文地址:.NET平台开源项目速览(1)SharpConfig配置文件读写组件
1.SharpConfig简介
SharpConfig是.NET平台一个使用非常简单的处理Cfg/ini配置文件的类库。
项目主页:https://github.com/cemdervis/SharpConfig,目前最新版本是1.4.3;
Nuget包主页:https://www.nuget.org/packages/sharpconfig/,其主要功能有:
1.支持的配置文件类型有cfg,ini格式;
2.支持注释功能,使用 # 符号开头;
3.支持直接读取和写入指定节点的值;
4.支持枚举,数组,以及和实体的直接映射;
5.支持内存的创建和使用,相对一个配置类型,直接在代码中初始化和使用;
2.SharpConfig基本使用
下面通过一个简单的Demo来大概知道如何使用。下载后,解压,新建项目,添加dll引用,需要添加命名空间:
using SharpConfig;
我们添加一个如下格式的文件,文件名称为:example.ini,这个文件可以手动创建放在项目中,设置属性:“始终复制”即可,或者自己手动复制到bin目录也行。方便调用,放在其他路径也可以,最终都是fileName的路径来找文件的。example.ini的内容如下,这个例子也是项目主页的例子,我稍微修改了下:
[General] #这代表Section,也就是节点
SomeString = Hello SharpConfig!
SomeInteger = 10 #这里也是注释
SomeFloat = 20.05
ABoolean = true
下面使用代码直接读取这个配置文件的值:
static void Test1()
{
//按文件名称加载配置文件
Configuration config = Configuration.LoadFromFile("example.ini");
//按照节的名称读取节
Section section = config["General"];
//依次根据每个配置项的名称来读取,如果配置文件类型搞错了,会报错
string someString = section["SomeString"].Value;
var someInteger = section["SomeInteger"].GetValue<Boolean>();
float someFloat = section["SomeFloat"].GetValue<float>();
Boolean someBool = section["ABoolean"].GetValue<Boolean>();
Console.WriteLine("当前节名称:{0}",section.Name );
Console.WriteLine("字符串SomeString值:{0}", someString);
Console.WriteLine("整数someInteger值:{0}", someInteger);
Console.WriteLine("双精度someFloat值:{0}", someFloat);
Console.WriteLine("布尔值someBool值:{0}", someBool);
}
结果如下:
保存配置文件有以下一些方法:
myConfig.Save( "myConfig.cfg" ); // 保存到cfg格式的文本文件
myConfig.Save( myStream ); //保存到文本流中
myConfig.SaveBinary( "myConfig.cfg" ); //保存到cfg格式的二进制文件
myConfig.SaveBinary( myStream ); // 保存到二进制文件
是不是很简单,速度也很快。下面看看其他功能的使用。上面只是一个最基本的使用例子。
3.特殊数据类型的配置项目
3.1 枚举类型
枚举类型的支持其实和上面的值类型差不多,也是直接使用泛型的类型参数类获取枚举,而数组是相对特殊一点的,所以单独拿出来给大家介绍。
假设有一个Section名称为DateInfo,项目的Day有一个Monday值,是枚举类型DayOfWeek的一个值。如下面所示:
[DateInfo]
Day = Monday
调用的时候,使用一个枚举类型DayOfWeek 来读取:
DayOfWeek day = config["DateInfo"]["Day"].GetValue<DayOfWeek>();
3.2 数组类型
数组类型的支持,首先是统一转换为object数组,然后根据自己的需求要手动转换,其实可以写一个扩展方法,很简单,就不展开了。例如下面有一个节的项目是:
[General]
MyArray = {0,2,5,6}
读取的方法为:
object[] myArray = config["General"]["MyArray"].GetValue<object[]>();
4.动态创建配置文件与使用
动态在内存中创建配置文件,其实就是把Configuration当作一个实体类一样,在代码中创建和使用。例如下面的代码:
static void Test2()
{
var myConfig = new Configuration();
//节点Video
myConfig["Video"]["Width"].Value = "1920";
myConfig["Video"]["Height"].Value = "1080";
//设置数组
myConfig["Video"]["Formats"].SetValue(new string[] { "RGB32", "RGBA32" });
//可以使用循环获取节点以及节点的所有项目,进行操作
foreach ( var section in myConfig )
{
foreach ( var setting in section )
{
//TODO:
}
}
//也可以直接使用节点和项目的名称来访问:
Console.WriteLine("Width:{0}", myConfig["Video"]["Width"].GetValue<Int32>());
Console.WriteLine("Height:{0}", myConfig["Video"]["Height"].GetValue<Int32>());
}
结果如下:

5.更简单的应用-对象映射
在文章发表之前,我在“这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧”一文中已经提到该项目,网友回复如果字符串中包括了#字符,可能会被认为是注释的事情,这个的确是一个隐藏bug,不过应该很少会碰到,这个解决方案自己绕过弯吧,真的有,就在程序或者使用实体类映射的时候,单独处理一下。
这种情况在以前使用XCode组件时用的比较多。不过SharpConfig也支持,挺好用的。相当于把实体类的字段和配置文件对应起来,可以更加方便使用。类型和配置文件映射后,可以直接操作对象了。不需要上面那些步骤。假设有一个Person对象,如下格式:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Gender Gender { get; set; }
}
Gender是一个性别的枚举类型,如下所示:
enum Gender
{
Male,
Female
}
假设配置文件是这样保存的:
[Person]
Name = Peter
Age = 50
Gender = Male
在实际使用的时候,使用下面的代码即可:
static void Test3()
{
Configuration config = Configuration.LoadFromFile("example.ini");
Person person = config["Person"].CreateObject<Person>();
Console.WriteLine("Name:{0}",person.Name);
Console.WriteLine("Age:{0}", person.Age);
Console.WriteLine("Gender:{0}", person.Gender);
}
结果如下:

当然也可以将config["Person"]节直接映射对一个已经存在的对象,会直接覆盖原来的值。如下面代码:
config["Person"].MapTo(person);
6.资源
大家可以从项目主页:https://github.com/cemdervis/SharpConfig下面源代码。亲,
我在这里提供一个下载,以及我使用的案例Demo例子。官方提供了一个Winform的图形界面,非常直观,这里截图看看,如果大家要用,从我这里下载也可以。
源码下载:http://files.cnblogs.com/files/asxinyu/SharpConfig-master.rar
编译4.0dll下载:SharpConfig.rar
Winform显示配置文件的图形界面

.NET平台开源项目速览(1)SharpConfig配置文件读写组件的更多相关文章
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
- .NET平台开源项目速览(5)深入使用与扩展SharpConfig组件
上个月在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 中都提到了SharpConfig组件,简单轻量级 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- .NET平台开源项目速览(12)哈希算法集合类库HashLib
.NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
- .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)
在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
随机推荐
- RecyclerView使用大全
RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- C#如何在PDF文件添加图片印章
文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...
- java中if和switch哪个效率快
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断:而 switch 只能对基本类型进行数值比较.两者的可比性就仅限在两个基本类型比较的范围内.说到基本类型 ...
- HTML5 Page Visibility
什么是 Page Visibility ? Page Visibility 即页面可见性,通过 visibilityState 的值检测页面当前是否可见.当一个网站是可见或点击选中的状态时 Page ...
- 深入理解 Android 之 View 的绘制流程
概述 本篇文章会从源码(基于Android 6.0)角度分析Android中View的绘制流程,侧重于对整体流程的分析,对一些难以理解的点加以重点阐述,目的是把View绘制的整个流程把握好,而对于特定 ...
- ORACLE从共享池删除指定SQL的执行计划
Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...
- Spring MVC数据校验
在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证.输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Jav ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...