如何遍歷 ini 文件中所有 Section 及 Key ? 如題:如何遍歷 ini 文件中所有 Section 及 Key ?C# 操作 ini 文件有沒有相關的系統函數? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 按照常规的XML处理不就好啦。 用api,很方便,,网上找的INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2……文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value)。Windows系统自带的Win32的API函数GetPrivateProfileString()和WritePrivateProfileString()分别实现了对INI文件的读写操作,他们位于kernel32.dll下。但是令人遗憾的是C#所使用的.NET框架下的公共类库并没有提供直接操作INI文件的类,所以唯一比较理想的方法就是调用API函数。然后,.Net框架下的类库是基于托管代码的,而API函数是基于非托管代码的,(在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。)如何实现托管代码与非托管代码之间的操作呢?.Net框架的System.Runtime.InteropServices命名空间下提供各种各样支持COM interop及平台调用服务的成员,其中最重要的属性之一DllImportAttribute可以用来定义用于访问非托管API的平台调用方法,它提供了对从非托管DLL导出的函数进行调用所必需的信息。下面就来看一下如何实现C#与API函数的互操作。 读操作:[DllImport("kernel32")]private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); section:要读取的段落名key: 要读取的键defVal: 读取异常的情况下的缺省值retVal: key所对应的值,如果该key不存在则返回空值size: 值允许的大小filePath: INI文件的完整路径和文件名写操作:[DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); section: 要写入的段落名key: 要写入的键,如果该key存在则覆盖写入val: key所对应的值filePath: INI文件的完整路径和文件名 using System; using System.Runtime.InteropServices; using System.Text; namespace IPVOD.Hotel.Remoting { /// INI文件的操作类 /// </summary> public class IniFile { public string Path; public IniFile(string path) { this.Path = path; } 声明读写INI文件的API函数声明读写INI文件的API函数#region 声明读写INI文件的API函数 [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath); #endregion /// 写INI文件 /// </summary> /// <param name="section">段落</param> /// <param name="key">键</param> /// <param name="iValue">值</param> public void IniWriteValue(string section, string key, string iValue) { WritePrivateProfileString(section, key, iValue, this.Path); } /// 读取INI文件 /// </summary> /// <param name="section">段落</param> /// <param name="key">键</param> /// <returns>返回的键值</returns> public string IniReadValue(string section, string key) { StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path); return temp.ToString(); } /// 读取INI文件 /// </summary> /// <param name="Section">段,格式[]</param> /// <param name="Key">键</param> /// <returns>返回byte类型的section组或键值组</returns> public byte[] IniReadValues(string section, string key) { byte[] temp = new byte[255]; int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path); return temp; } }}DLL导出的函数GetPrivateProfileString的重载[DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);section:要读取的段落名key: 要读取的键defVal: 读取异常的情况下的缺省值retVal: 此参数类型不是string,而是Byte[]用于返回byte类型的section组或键值组。size: 值允许的大小filePath: INI文件的完整路径和文件名下面看一下具体实例化IniFile类的操作: //path为ini文件的物理路径IniFile ini = new IniFile(path);//读取ini文件的所有段落名byte[] allSection = ini.IniReadValues(null, null);通过如下方式转换byte[]类型为string[]数组类型string[] sectionList;ASCIIEncoding ascii = new ASCIIEncoding();//获取自定义设置section中的所有key,byte[]类型sectionByte = ini.IniReadValues("personal", null);//编码所有key的string类型sections = ascii.GetString(sectionByte);//获取key的数组sectionList = sections.Split(new char[1]{'\0'});//读取ini文件personal段落的所有键名,返回byte[]类型byte[] sectionByte = ini.IniReadValues("personal", null);//读取ini文件evideo段落的MODEL键值model = ini.IniReadValue("evideo", "MODEL");//将值eth0写入ini文件evideo段落的DEVICE键ini.IniWriteValue("evideo", "DEVICE", "eth0");即:[evideo]DEVICE = eth0//删除ini文件下personal段落下的所有键ini.IniWriteValue("personal", null, null);//删除ini文件下所有段落ini.IniWriteValue(null, null, null);这样,在就可以使用对他们的调用,用常规的方式定义一个名为IniFile类: string[] _IniText = File.ReadAllLines(@"C:\1.ini", Encoding.Default); IList<string> _SectionList =new List<string>(); IList<string> _KeyList =new List<string>(); for (int i = 0; i != _IniText.Length;i++ ) { string _Text = _IniText[i].Trim(); if (_Text[0] == '[' && _Text[_Text.Length - 1] == ']') { _SectionList.Add(_Text); } else { _KeyList.Add(_Text.Split('=')[0]); } } GetPrivateProfileSectionNames 可以返回所有的session值吧,然后调用 GetPrivateProfileString去获取相应的key参考 [DllImport("kernel32")] private static extern bool GetPrivateProfileString( string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString , int nSize, string lpFileName);StringBuilder strcaption =new StringBuilder(256); StringBuilder strcaption1=new StringBuilder(256); if(GetPrivateProfileString("","","",strcaption,strcaption.Capacity,文件地址)) { public class INIClass { public string inipath; [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath); /// <summary> /// 构造方法 /// </summary> /// <param name="INIPath">文件路径</param> public INIClass(string INIPath) { inipath = INIPath; } /// <summary> /// 写入INI文件 /// </summary> /// <param name="Section">项目名称(如 [TypeName] )</param> /// <param name="Key">键</param> /// <param name="Value">值</param> public void IniWriteValue(string Section,string Key,string Value) { WritePrivateProfileString(Section,Key,Value,this.inipath); } /// <summary> /// 读出INI文件 /// </summary> /// <param name="Section">项目名称</param> /// <param name="Key">键</param> public string IniReadValue(string Section,string Key) { StringBuilder temp = new StringBuilder(500); int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath); return temp.ToString(); } /// <summary> /// 验证文件是否存在 /// </summary> public bool ExistINIFile() { return File.Exists(inipath); } } 请教时间判断 Winform程序如何自适应不同分辨率 VS2008 用Crystal Report做报表不能翻第3页 MediaPlayer全屏问题 数据连接的安全性问题 [**急**]100分求助有关事件触发的问题 c#如何调用snmp++ datagridview部分数据保存失败 --我公司做“短信平台”,我希望可以参加,因此我想知道我需要学习那些内容。--分可以加! 一个private函数中调用另一个private函数中的变量,该如何实现? c# winform调用vb pb dll问题 向数据库添加一条记录时,如何控制文字中格式
key 1 = value2
key 1 = value2……文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value)。Windows系统自带的Win32的API函数GetPrivateProfileString()和WritePrivateProfileString()分别实现了对INI文件的读写操作,他们位于kernel32.dll下。
但是令人遗憾的是C#所使用的.NET框架下的公共类库并没有提供直接操作INI文件的类,所以唯一比较理想的方法就是调用API函数。然后,.Net框架下的类库是基于托管代码的,而API函数是基于非托管代码的,(在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。)如何实现托管代码与非托管代码之间的操作呢?.Net框架的System.Runtime.InteropServices命名空间下提供各种各样支持COM interop及平台调用服务的成员,其中最重要的属性之一DllImportAttribute可以用来定义用于访问非托管API的平台调用方法,它提供了对从非托管DLL导出的函数进行调用所必需的信息。下面就来看一下如何实现C#与API函数的互操作。 读操作:[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);
section:要读取的段落名
key: 要读取的键
defVal: 读取异常的情况下的缺省值
retVal: key所对应的值,如果该key不存在则返回空值
size: 值允许的大小
filePath: INI文件的完整路径和文件名写操作:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
section: 要写入的段落名
key: 要写入的键,如果该key存在则覆盖写入
val: key所对应的值
filePath: INI文件的完整路径和文件名 using System;
using System.Runtime.InteropServices;
using System.Text;
namespace IPVOD.Hotel.Remoting
{
/// INI文件的操作类
/// </summary>
public class IniFile
{
public string Path; public IniFile(string path)
{
this.Path = path;
}
声明读写INI文件的API函数声明读写INI文件的API函数#region 声明读写INI文件的API函数
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); [DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);
#endregion
/// 写INI文件
/// </summary>
/// <param name="section">段落</param>
/// <param name="key">键</param>
/// <param name="iValue">值</param>
public void IniWriteValue(string section, string key, string iValue)
{
WritePrivateProfileString(section, key, iValue, this.Path);
}
/// 读取INI文件
/// </summary>
/// <param name="section">段落</param>
/// <param name="key">键</param>
/// <returns>返回的键值</returns>
public string IniReadValue(string section, string key)
{
StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path);
return temp.ToString();
}
/// 读取INI文件
/// </summary>
/// <param name="Section">段,格式[]</param>
/// <param name="Key">键</param>
/// <returns>返回byte类型的section组或键值组</returns>
public byte[] IniReadValues(string section, string key)
{
byte[] temp = new byte[255]; int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path);
return temp;
}
}
}
DLL导出的函数GetPrivateProfileString的重载[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);
section:要读取的段落名
key: 要读取的键
defVal: 读取异常的情况下的缺省值
retVal: 此参数类型不是string,而是Byte[]用于返回byte类型的section组或键值组。
size: 值允许的大小
filePath: INI文件的完整路径和文件名下面看一下具体实例化IniFile类的操作:
//path为ini文件的物理路径IniFile ini = new IniFile(path);//读取ini文件的所有段落名byte[] allSection = ini.IniReadValues(null, null);
通过如下方式转换byte[]类型为string[]数组类型string[] sectionList;ASCIIEncoding ascii = new ASCIIEncoding();//获取自定义设置section中的所有key,byte[]类型sectionByte = ini.IniReadValues("personal", null);//编码所有key的string类型sections = ascii.GetString(sectionByte);//获取key的数组sectionList = sections.Split(new char[1]{'\0'});
//读取ini文件personal段落的所有键名,返回byte[]类型byte[] sectionByte = ini.IniReadValues("personal", null);
//读取ini文件evideo段落的MODEL键值model = ini.IniReadValue("evideo", "MODEL");
//将值eth0写入ini文件evideo段落的DEVICE键ini.IniWriteValue("evideo", "DEVICE", "eth0");即:[evideo]DEVICE = eth0
//删除ini文件下personal段落下的所有键ini.IniWriteValue("personal", null, null);
//删除ini文件下所有段落ini.IniWriteValue(null, null, null);
这样,在就可以使用对他们的调用,用常规的方式定义一个名为IniFile类:
IList<string> _KeyList =new List<string>();
for (int i = 0; i != _IniText.Length;i++ )
{
string _Text = _IniText[i].Trim(); if (_Text[0] == '[' && _Text[_Text.Length - 1] == ']')
{
_SectionList.Add(_Text);
}
else
{
_KeyList.Add(_Text.Split('=')[0]);
}
}
然后调用 GetPrivateProfileString去获取相应的key
参考
private static extern bool GetPrivateProfileString(
string lpApplicationName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString ,
int nSize,
string lpFileName);
StringBuilder strcaption =new StringBuilder(256);
StringBuilder strcaption1=new StringBuilder(256);
if(GetPrivateProfileString("","","",strcaption,strcaption.Capacity,文件地址))
{
{
public string inipath;
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
/// <summary>
/// 构造方法
/// </summary>
/// <param name="INIPath">文件路径</param>
public INIClass(string INIPath)
{
inipath = INIPath;
}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public void IniWriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.inipath);
}
/// <summary>
/// 读出INI文件
/// </summary>
/// <param name="Section">项目名称</param>
/// <param name="Key">键</param>
public string IniReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(500);
int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath);
return temp.ToString();
}
/// <summary>
/// 验证文件是否存在
/// </summary>
public bool ExistINIFile()
{
return File.Exists(inipath);
}
}