如何遍歷 ini 文件中所有 Section 及 Key ?

rockyvan 2009-07-09 01:37:54
如題:
如何遍歷 ini 文件中所有 Section 及 Key ?

C# 操作 ini 文件有沒有相關的系統函數?
...全文
895 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2009-07-09
  • 打赏
  • 举报
回复
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);
}
}
wuyq11 2009-07-09
  • 打赏
  • 举报
回复
[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,文件地址))
{
rockyvan 2009-07-09
  • 打赏
  • 举报
回复
多謝各位!我先仔細研究一下。
enihs 2009-07-09
  • 打赏
  • 举报
回复
GetPrivateProfileSectionNames 可以返回所有的session值吧,
然后调用 GetPrivateProfileString去获取相应的key
参考
zgke 2009-07-09
  • 打赏
  • 举报
回复
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]);
}


}
hecker728 2009-07-09
  • 打赏
  • 举报
回复
用api,很方便,,网上找的

INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]
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类:
tangli5668 2009-07-09
  • 打赏
  • 举报
回复
我想下这个文件,谁能教教我应该怎么操作的 旺旺群发 5.7版 免费旺旺群发
huhuaqiwen 2009-07-09
  • 打赏
  • 举报
回复
学习
qldsrx 2009-07-09
  • 打赏
  • 举报
回复
按照常规的XML处理不就好啦。
tangli5668 2009-07-09
  • 打赏
  • 举报
回复
不知道为什么留言!!!!!!!!
江城老温 2009-07-09
  • 打赏
  • 举报
回复
得自己写代码遍历。

111,096

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧