.NET平台开源项目速览(5)深入使用与扩展SharpConfig组件
2015-06-29 09:05
651 查看
原文:.NET平台开源项目速览(5)深入使用与扩展SharpConfig组件 上个月在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 中都提到了SharpConfig组件,简单轻量级,速度快,而且还有比较深入的使用介绍。在文章发布后,也有网友提到一些问题,当时我也没仔细去分析,在这次我亲自使用的过程中,就对几个问题进行了比较深入的研究,同时对不满足自己的地方,也进行了扩展。所以今天就把对SharpConfig的源码进行一个简单的分析,同时也根据需求对自己的一个特殊情况进行扩展。自己动手丰衣足食。。。
.NET开源目录:【目录】本博客其他.NET开源项目文章目录
本文原文地址:.NET平台开源项目速览(5)深入使用与扩展SharpConfig组件
Configuration是核心类,我们在前面的文章中只是简单的介绍了一下如何加载配置文件,查看源代码,可以发现加载和保存的方法都是匹配的,都可以从文件或者数据流中加载或者保存。
View Code
上面我进行了注释的翻译,从流程可以看到,SharpConfig是依次读取每一行直接进行转换,看看满足什么特征,然后进行处理。如果直接换行,没有Name和=号对应,那会报错。所以我们自己动手,扩展一下,其实非常简单。
上述代码是我已经扩展好的,思路很简单,我们选得一个标记字符串,这里使用“...”作为值换行的标记,每一次读取新行的值后,我们先进行换行判断,如果包含"...",就默认作为当前节最后一个Setting的附加值,手动加上换行符"\r\n"。所以核心的代码其实很简单,主要是你要搞清楚流程,要加在哪里:
我们看一个例子,来测试一下换行值的情况,下面是配置文件:
控制台直接读取这个值的代码:
结果如下,已经默认进行换行了:
另外,我也对SharpConfig进行了翻译,可以便于大家更方便的使用,源码可以去github的地址下载,帮助文档也在里面哦。这里先截个图:
这个帮助文档也是使用:.NET平台开源项目速览(4).NET文档生成工具ADB及使用 文章中的ADB工具来生成的,非常好用。
文档和源码下载地址:https://github.com/asxinyu/Improved_SharpConfig
.NET开源目录:【目录】本博客其他.NET开源项目文章目录
本文原文地址:.NET平台开源项目速览(5)深入使用与扩展SharpConfig组件
1.SharpConfig源码分析
SharpConfig源码并不大,核心代码其实也很简单,就是文件读写,解析。在深入使用和扩展SharpConfig之前,有必要了解一下它的基本结构。所以先来介绍SharpConfig源码中核心的3大类。Configuration是核心类,我们在前面的文章中只是简单的介绍了一下如何加载配置文件,查看源代码,可以发现加载和保存的方法都是匹配的,都可以从文件或者数据流中加载或者保存。
//根据字符串解析配置文件,核心的解析函数 private static Configuration Parse(string source) { //重置临时字段 mLineNumber = 0; Configuration config = new Configuration(); Section currentSection = null; var preComments = new List<Comment>(); using (var reader = new StringReader(source)) { string line = null; // 读取一行,直到结尾(Read until EOF.) while ((line = reader.ReadLine()) != null) { mLineNumber++; //删除前后空白字符 line = line.Trim(); //这里扩展核心的换行支持,使用 3个 ... 开头,说明是上一个设置的换行 //每一次行都读取下一行试一下,如果有...,就添加 if(line.StartsWith("...")) { var text = "\r\n" + line.Substring(3); currentSection[currentSection.SettingCount - 1].Value += text; continue; } //如果是空行跳过 if (string.IsNullOrEmpty(line)) continue; int commentIndex = 0; var comment = ParseComment(line, out commentIndex); if (!mIgnorePreComments && commentIndex == 0) { // 解析注释行,添加到 注释列表中去 preComments.Add(comment); continue; } else if (!mIgnoreInlineComments && commentIndex > 0) { // 去掉这一行的注释 line = line.Remove(commentIndex).Trim(); } //如果开始字符是 [ ,说明是 节(Sections) if (line.StartsWith("[")) { #region 节解析 currentSection = ParseSection(line); if (!mIgnoreInlineComments) currentSection.Comment = comment; if (config.Contains(currentSection.Name)) { throw new ParserException(string.Format( "The section '{0}' was already declared in the configuration.", currentSection.Name), mLineNumber); } if (!mIgnorePreComments && preComments.Count > 0) { currentSection.mPreComments = new List<Comment>(preComments); preComments.Clear(); } config.mSections.Add(currentSection); #endregion } else //否则就是键值设置行 { //解析设置行 Setting setting = ParseSetting(line); if (!mIgnoreInlineComments) setting.Comment = comment; if (currentSection == null) throw new ParserException(string.Format("The setting '{0}' has to be in a section.", setting.Name), mLineNumber); if (currentSection.Contains(setting.Name)) throw new ParserException(string.Format("The setting '{0}' was already declared in the section.", setting.Name), mLineNumber); if (!mIgnorePreComments && preComments.Count > 0) { setting.mPreComments = new List<Comment>(preComments); preComments.Clear(); } currentSection.Add(setting); } } } return config; }
View Code
上面我进行了注释的翻译,从流程可以看到,SharpConfig是依次读取每一行直接进行转换,看看满足什么特征,然后进行处理。如果直接换行,没有Name和=号对应,那会报错。所以我们自己动手,扩展一下,其实非常简单。
上述代码是我已经扩展好的,思路很简单,我们选得一个标记字符串,这里使用“...”作为值换行的标记,每一次读取新行的值后,我们先进行换行判断,如果包含"...",就默认作为当前节最后一个Setting的附加值,手动加上换行符"\r\n"。所以核心的代码其实很简单,主要是你要搞清楚流程,要加在哪里:
//这里扩展核心的换行支持,使用 3个 ... 开头,说明是上一个设置的换行 //每一次行都读取下一行试一下,如果有...,就添加 if(line.StartsWith("...")) { var text = "\r\n" + line.Substring(3); currentSection[currentSection.SettingCount - 1].Value += text; continue; }
我们看一个例子,来测试一下换行值的情况,下面是配置文件:
控制台直接读取这个值的代码:
//按文件名称加载配置文件 Configuration config = Configuration.LoadFromFile("example.ini", Encoding.GetEncoding("gb2312")); Section section = config["General"]; string someString = section["SomeString"].Value; Console.WriteLine("字符串SomeString值:{0}", someString);
结果如下,已经默认进行换行了:
3.资源
现在写博客频繁了,也有大量代码,所以开始使用github,这次就作为我的第一个开源项目代码吧,把我修改后的源码发在上面,大家去下载好了。另外,我也对SharpConfig进行了翻译,可以便于大家更方便的使用,源码可以去github的地址下载,帮助文档也在里面哦。这里先截个图:
这个帮助文档也是使用:.NET平台开源项目速览(4).NET文档生成工具ADB及使用 文章中的ADB工具来生成的,非常好用。
文档和源码下载地址:https://github.com/asxinyu/Improved_SharpConfig
相关文章推荐
- 简介Linux中cp和mv搭配{,}在shell当中的用法
- 黑马程序员——网络编程
- 使用jquery操作session方法分享
- iOS: 如何正确的绘制1像素的线
- C++类型转换
- 雷军武大演讲:快40岁时 我曾觉得梦想渐行渐远
- 源码推荐(6.29):美团向下展开列表,仿QQ左侧抽屉效果leftSlideMenu
- 【C语言】注释转换 ——C注释转换为标准C++语言注释
- C++ Programming Tutorials_3翻译
- .NET平台开源项目速览(4).NET文档生成工具ADB及使用
- 设置SecureCRT配色和解决乱码问题
- iOS NSData类型
- 给你推荐10款优秀的 HTML5 动画工具
- android studio 新建项目 界面一直停在 【“building ‘ 项目名’ gradle project info”】
- C语言字符数组
- Shell脚本实现的基于SVN的代码提交量统计工具
- C#通过指针读取文件的方法
- 《Java课程实习》日志(周一)
- checkStyle使用详解
- .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB