博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我的INI 配置文件读写动态库
阅读量:7209 次
发布时间:2019-06-29

本文共 6266 字,大约阅读时间需要 20 分钟。

 

工作需要,今天上午花时间看了一下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 函数。

是Windows 9x/Me 中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理。
 
INI 配置文件读写动态库 INIHelper.dll 的源码很简单,代码如下:
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文件路径 } /// /// 写入INI文件 /// /// 节点名称[如[TypeName]] /// 键 /// 值 /// 文件路径 ///
[DllImport("kernel32")] public static extern long WritePrivateProfileString(string section, string key, string val, string filepath); /// /// 写入 /// /// section 节点名称 /// key 值 /// value 值 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("配置文件不存在或权限不足导致无法写入"); } } /// /// 写入默认节点"FileConfig"下的相关数据 /// /// key 值 /// value 值 public void Write(string key, string value) {
// section 节点名称使用默认值:"FileConfig" Write("FileConfig", key, value); } /// /// 读取INI文件 /// /// 节点名称 /// 键 /// 值 /// stringbulider对象 /// 字节大小 /// 文件路径 ///
[DllImport("kernel32")] public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retval, int size, string filePath); /// /// 读取 /// /// section 节点名称 /// key 值 ///
value 值
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("配置文件不存在"); } } /// /// 读取默认节点"FileConfig"下的相关数据 /// /// key 值 ///
value 值
public string Read(string key) {
// section 节点名称使用默认值:"FileConfig" return Read("FileConfig", key); } } }
 

对 INIHelper.dll 动态库的使用和测试,代码如下:

// 获取INI文件路径
//
 private string strFilePath = Application.StartupPath + "\\FileConfig.ini";
//
写入
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
"));
}
 

参考来源:

 

转载地址:http://hvrum.baihongyu.com/

你可能感兴趣的文章
Duplicate fragment name ERROR Jetty Maven Plugin
查看>>
Hbase关于Java常用API举例
查看>>
c语言: 文件io, 拷贝文件(二进制)
查看>>
mysql性能优化-慢查询分析、优化索引和配置
查看>>
MYSQL操作数据表中的记录
查看>>
系统内存和CPU管理、监控
查看>>
java枚举的应用
查看>>
javascript中使用循环链表实现约瑟夫环问题
查看>>
Javascript防冒泡事件与Event对象
查看>>
DevExpress Crack
查看>>
在Centos7服务器上搭建网关服务
查看>>
使用Guid做主键和int做主键性能比较
查看>>
Java调用solrj5.5.3接口,查询数据
查看>>
[Android Pro] Android TypedValue.applyDimension()的用法
查看>>
MySql笔记
查看>>
Odoo 二次开发教程(三)-第一个Model及Form、Tree视图
查看>>
Entity Framework Core 1.1 升级通告
查看>>
MySQL:procedure, function, cursor,handler
查看>>
委托的多种写法
查看>>
关于优酷视频代码播放的若干事情……
查看>>