我的INI 配置文件读写动态库
工作需要,今天上午花时间看了一下INI 配置文件的相关文章,并添加到项目中。
后来想想,干脆封装成DLL 动态库,并提供给大家使用,顺便更新一下博客。^_^
INI 配置文件的格式
在早期的Windows 桌面系统中,主要是用INI 文件作为系统的配置文件,从Win95 以后开始转向使用注册表,但是还有很多系统配置是使用INI 文件的。其实,INI 文件就是简单的text 文件,只不过这种txt 文件要遵循一定的INI 文件格式。
“.ini” 就是英文 “initialization” 的头三个字母的缩写;当然INI file 的后缀名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。
经典格式:
INI文件的格式很简单,最基本的三个要素是:parameters,sections 和 comments。
什么是 parameters?
INI所包含的最基本的“元素”就是parameter;每一个parameter都有一个name和一个value,name和value是由等号“=”隔开。name在等号的左边。
如: name = value
什么是sections ?
所有的parameters都是以sections为单位结合在一起的。所有的section名称都是独占一行,并且sections名字都被方括号包围着 ([ and ])。在section声明后的所有parameters都是属于该section。对于一个section没有明显的结束标志符,一个section的 开始就是上一个section的结束,或者是end of the file。Sections一般情况下不能被nested,当然特殊情况下也可以实现sections的嵌套。
section 如: [section]
什么是 comments ?
在INI 文件中注释语句是以分号“;”开始的。所有的注释语句不管多长都是独占一行直到结束的。在分号和行结束符之间的所有内容都是被忽略的。
注释如: ;comments text
当然,上面讲的都是最经典的INI文件格式,随着使用的需求INI文件的格式也出现了很多变种;
我的 INI 配置文件读写动态库
其实就是调用了kernel32.dll 中的 WritePrivateProfileString 和 GetPrivateProfileString 函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
namespace INIHelper
{
public class INIFileHelper
{
private string strFileName = ""; //INI文件名
private string strFilePath = "";//获取INI文件路径
public INIFileHelper()
{
strFileName = "Config.ini"; //INI文件名
//方法1:获取INI文件路径
strFilePath = Directory.GetCurrentDirectory() + "\\" + strFileName;
//方法2:获取INI文件路径
//strFilePath = Path.GetFullPath(".\\") + strFileName;
}
public INIFileHelper(string FileName)
{
strFileName = FileName; //INI文件名
//获取INI文件路径
strFilePath = Directory.GetCurrentDirectory() + "\\" + strFileName;
}
public INIFileHelper(string FullPath, string FileName)
{
strFileName = FileName; //INI文件名
strFilePath = FullPath + "\\" + strFileName;//获取INI文件路径
}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name="section">节点名称[如[TypeName]]</param>
/// <param name="key">键</param>
/// <param name="val">值</param>
/// <param name="filepath">文件路径</param>
/// <returns></returns>
[DllImport("kernel32")]
public static extern long WritePrivateProfileString(string section, string key, string val, string filepath);
/// <summary>
/// 写入
/// </summary>
/// <param name="sectionName">section 节点名称</param>
/// <param name="key">key 值</param>
/// <param name="value">value 值</param>
public void Write(string sectionName, string key, string value)
{
try
{
//根据INI文件名设置要写入INI文件的节点名称
//此处的节点名称完全可以根据实际需要进行配置
strFileName = Path.GetFileNameWithoutExtension(strFilePath);
INIFileHelper.WritePrivateProfileString(sectionName, key, value, strFilePath);
}
catch
{
throw new Exception("配置文件不存在或权限不足导致无法写入");
}
}
/// <summary>
/// 写入默认节点"FileConfig"下的相关数据
/// </summary>
/// <param name="key">key 值</param>
/// <param name="value">value 值</param>
public void Write(string key, string value)
{
// section 节点名称使用默认值:"FileConfig"
Write("FileConfig", key, value);
}
/// <summary>
/// 读取INI文件
/// </summary>
/// <param name="section">节点名称</param>
/// <param name="key">键</param>
/// <param name="def">值</param>
/// <param name="retval">stringbulider对象</param>
/// <param name="size">字节大小</param>
/// <param name="filePath">文件路径</param>
/// <returns></returns>
[DllImport("kernel32")]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath);
/// <summary>
/// 读取
/// </summary>
/// <param name="sectionName">section 节点名称</param>
/// <param name="key">key 值</param>
/// <returns>value 值</returns>
public string Read(string sectionName, string key)
{
if (File.Exists(strFilePath)) //读取时先要判读INI文件是否存在
{
strFileName = Path.GetFileNameWithoutExtension(strFilePath);
//return ContentValue(strFileName, key);
StringBuilder outValue = new StringBuilder(1024);
INIFileHelper.GetPrivateProfileString(sectionName, key, "", outValue, 1024, strFilePath);
return outValue.ToString();
}
else
{
throw new Exception("配置文件不存在");
}
}
/// <summary>
/// 读取默认节点"FileConfig"下的相关数据
/// </summary>
/// <param name="key">key 值</param>
/// <returns>value 值</returns>
public string Read(string key)
{
// section 节点名称使用默认值:"FileConfig"
return Read("FileConfig", key);
}
}
}
对 INIHelper.dll 动态库的使用和测试,代码如下:
//写入
private void button1_Click(object sender, EventArgs e)
{
//test1(WinForm 测试)
string strFilePath = "Config.ini";//获取INI文件路径
INIFileHelper file1 = new INIFileHelper(strFilePath);
file1.Write(label1.Text, textBox1.Text);
file1.Write(label2.Text, textBox2.Text);
MessageBox.Show("test1 写入完毕");
//test2
INIFileHelper file2 = new INIFileHelper();
file2.Write("xugang", "http://xugang.cnblogs.com");
file2.Write("hobby", "@#$%^&*()");
MessageBox.Show("test2 写入完毕");
//test3
INIFileHelper file3 = new INIFileHelper("newConfig.ini");
file3.Write("NewSection", "xugang", "http://xugang.cnblogs.com");
file3.Write("NewSection", "hobby", "@#$%^&*()");
MessageBox.Show("test3 写入完毕");
//test4
string strPath = Application.StartupPath; //文件路径
string strName = "xxx.ini";//INI文件名称
INIFileHelper file4 = new INIFileHelper(strPath, strName);
file4.Write("NewSection", "xugang", "http://xugang.cnblogs.com");
file4.Write("NewSection", "hobby", "@#$%^&*()");
MessageBox.Show("test4 写入完毕");
}
//读取
private void button2_Click(object sender, EventArgs e)
{
//test1(WinForm 测试)
string strFilePath = "Config.ini";//获取INI文件路径
INIFileHelper file1 = new INIFileHelper(strFilePath);
StringBuilder str = new StringBuilder();
str.AppendLine(file1.Read(label1.Text));
str.AppendLine(file1.Read(label2.Text));
MessageBox.Show(str.ToString());
//test2
INIFileHelper file2 = new INIFileHelper();
MessageBox.Show(file2.Read("xugang") +" "+file2.Read("hobby"));
//test3
INIFileHelper file3 = new INIFileHelper("newConfig.ini");
MessageBox.Show( file3.Read("NewSection", "xugang")
+ " " + file3.Read("NewSection", "hobby"));
//test4
string strPath = Application.StartupPath; //文件路径
string strName = "xxx.ini";//INI文件名称
INIFileHelper file4 = new INIFileHelper(strPath, strName);
MessageBox.Show(file4.Read("NewSection", "xugang")
+ " " + file4.Read("NewSection", "hobby"));
}
参考来源:
作者: XuGang 网名:钢钢 |
出处: http://xugang.cnblogs.com |
声明: 本文版权归作者和博客园共有。转载时必须保留此段声明,且在文章页面明显位置给出原文连接地址! |