第一个规范的C#类库
2015-11-24 23:04
363 查看
由于项目的需要,要在C#里操作.ini相关的操作。结合自己现在的学习进度,决定将以后要实现的通用的功能写成类库。在网上寻找相关的资料后就开始动手写,希望以后能把这个类库写成一个有架构的(但愿如此)。一来以后便于总结,而来也可以给别人使用(但愿有人使用^^)。
首先来介绍一下,.ini配置文件。这个一般是在windows程序里使用,还是比较常见的。简单来说,我们可以把它看成一个数据库,分为section,key-value这两级。section是指一个配置集合所在的区域,在这个区域里有许多key-value的配置,key可以看成索引或者关键字,这个关键字的值便是value了。比如学生名字与成绩的一组对应。编辑文件的效果是这样的:
接下来我们需要调用windows用来处理ini配置文件的API函数。调用Windows的API函数需要用到using System.Runtime.InteropServices命名空间,这个空间下的成员类可以让我们有能力调用Windows中的API函数(一般都包含在kernel32.dll里)。调用格式与说明如下:
然后就可以写类了,这里的功能比较少,提供了三个公共变量,并进行异常处理,代码如下:
写好类之后先简单进行一下测试(就两个功能,就测试一下读写就行),代码如下:
经过测试,功能还算正常。虽然比较简单,不过也算是走了一遍流程,以后编写好代码一定要养成将代码抽象成基础的类库,这个类就是起点(PS:写博客还真是锻炼人的组织能力。。)
参考:http://www.cnblogs.com/gaohades/archive/2006/01/24/322751.html
首先来介绍一下,.ini配置文件。这个一般是在windows程序里使用,还是比较常见的。简单来说,我们可以把它看成一个数据库,分为section,key-value这两级。section是指一个配置集合所在的区域,在这个区域里有许多key-value的配置,key可以看成索引或者关键字,这个关键字的值便是value了。比如学生名字与成绩的一组对应。编辑文件的效果是这样的:
[first] name=haloworld [串口1] 波特率=9600 奇偶校验=奇校验 停止位=1
接下来我们需要调用windows用来处理ini配置文件的API函数。调用Windows的API函数需要用到using System.Runtime.InteropServices命名空间,这个空间下的成员类可以让我们有能力调用Windows中的API函数(一般都包含在kernel32.dll里)。调用格式与说明如下:
using System.Runtime.InteropServices;//调用windows的API #region ##调用windows的API## /// <summary> /// DLL调用读取ini文件API函数 /// </summary> /// <param name="section">要读取的段落</param> /// <param name="key">要读取值的键</param> /// <param name="defVal">读取异常情况下的缺省值</param> /// <param name="retVal">key(键值对应的值),若不存在则返回空值</param> /// <param name="size">该值所允许的大小</param> /// <param name="filePath">ini文件的完整路径名称</param> /// <returns>返回值类型</returns> [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); /// <summary> /// DLL调用写入ini文件API函数 /// </summary> /// <param name="section">要写入的段落</param> /// <param name="key">要写入的值的键</param> /// <param name="val">key所对应的值</param> /// <param name="filePath">ini文件的完整路径名称</param> /// <returns>返回值类型</returns> [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); #endregion
然后就可以写类了,这里的功能比较少,提供了三个公共变量,并进行异常处理,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace halo_class_lib { public class iniFile { #region ##调用windows的API## /// <summary> /// DLL调用读取ini文件API函数 /// </summary> /// <param name="section">要读取的段落</param> /// <param name="key">要读取值的键</param> /// <param name="defVal">读取异常情况下的缺省值</param> /// <param name="retVal">key(键值对应的值),若不存在则返回空值</param> /// <param name="size">该值所允许的大小</param> /// <param name="filePath">ini文件的完整路径名称</param> /// <returns>返回值类型</returns> [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); /// <summary> /// DLL调用写入ini文件API函数 /// </summary> /// <param name="section">要写入的段落</param> /// <param name="key">要写入的值的键</param> /// <param name="val">key所对应的值</param> /// <param name="filePath">ini文件的完整路径名称</param> /// <returns>返回值类型</returns> [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); #endregion #region ##变量声明## private string _iniPath = "C:/default.ini";//配置文件路径,默认使用C盘根目录 private string _deVal = "null"; //读取异常情况的缺省值 private int _bufferSize = 255; //缓存大小 public string iniPath { set { _iniPath = value; } get { return _iniPath; } } public string deVal { set { _deVal = value; } get { return _deVal; } } public int bufferSize { set {_bufferSize = value;} get {return _bufferSize;} } #endregion #region ## 公共函数 ## public iniFile(string Path, int Size, string DeVal) { _iniPath = Path; _bufferSize = Size; _deVal = DeVal; } public iniFile(string Path) { _iniPath = Path; } /// <summary> /// 读配置函数 /// </summary> /// <param name="section">要读取的段落</param> /// <param name="key">要读取的值的键</param> /// <param name="path">配置文件路径</param> /// <returns>返回读取值,若读取失败返回“####”</returns> public string readIniValue(string section, string key , string path = null) { if (path != null) { this._iniPath = path; } StringBuilder temp = new StringBuilder(_bufferSize); if (File.Exists(this._iniPath)) { try { GetPrivateProfileString(section, key, this._deVal, temp, this._bufferSize, this._iniPath); } catch (System.Exception ex) { throw ex;//在类中不宜使用对话框、打印输出等手段,还是抛出比较好 } return temp.ToString(); } else return "####"; } /// <summary> /// 写配置文件函数 /// </summary> /// <param name="section">要写入的段落</param> /// <param name="key">要写入值的键</param> /// <param name="keyValue">要写入的值</param> /// <param name="path">配置文件的路径</param> /// <returns>true-成功;false-失败</returns> public bool writeIniValue(string section, string key, string keyValue, string path = null)//若不存在配置文件,需要创建 { if (path != null) { this._iniPath = path; } if (!File.Exists(this._iniPath)) { using (StreamWriter sw = File.CreateText(this._iniPath)) { sw.Close(); } } try { WritePrivateProfileString(section, key, keyValue, this.iniPath); } catch (System.Exception ex) { return false; throw ex; } return true; } #endregion } }
写好类之后先简单进行一下测试(就两个功能,就测试一下读写就行),代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using halo_class_lib; namespace test22 { class Program { static void Main(string[] args) { iniFile my = new iniFile("D:/HALO.ini", 255, "#"); my.writeIniValue("串口1", "波特率", "9600"); my.writeIniValue("串口1", "奇偶校验", "奇校验"); my.writeIniValue("串口1", "停止位", "1"); //string her = my.readIniValue("first", "name"); //System.Console.WriteLine(her); //System.Console.Read(); } } }
经过测试,功能还算正常。虽然比较简单,不过也算是走了一遍流程,以后编写好代码一定要养成将代码抽象成基础的类库,这个类就是起点(PS:写博客还真是锻炼人的组织能力。。)
参考:http://www.cnblogs.com/gaohades/archive/2006/01/24/322751.html
相关文章推荐
- C#(WPF)按钮图片不显示,壁纸切换功能
- VS2015 C#6.0
- C# FTP上传下载(支持断点续传)
- C# FTP上传下载(支持断点续传)
- VS2015 C#6.0 中的那些新特性
- 20151124001 关闭C#主窗体弹出是否关闭对话框
- C#命名规则
- C#~构造方法
- c# ConfigurationSection
- C#中的委托与事件
- c# 基础部分 (基本数据类型-- 表达式)
- C#跳转语句
- 轻松学习C#的正则表达式
- [转载收藏]C#基础知识梳理系列十一:垃圾回收机制
- C# XML解析
- C#中的内存四区
- 关于C#中对象用作属性
- Observer Pattern 在C#是怎么使用的(一)
- C#获取当前路径的7种方法
- C#调用Web Service时的身份验证