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

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

C# 操作 ini 文件有沒有相關的系統函數?
...全文
789 11 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
得自己写代码遍历。
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持sectionkey或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分sectionkey大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复sectionkey。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有sectionkey名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
适合人群:【学习前提】 1. 具备python3语言基础 【学习人群】 1. 手工测试人员学习UI自动化测试技能 2. 开发人员转岗测试开发岗位 3. 如具有丰富的自动化测经验,本课程可能并不满足你学习计划:1.下载课程配套的软件资料 2.结合课件Demo可完成学习任务课程目标:掌握UI自动化测试框架的设计与实现课程简介:UI自动化框架的设计需储备基础知识,方能完成自动化测试框架的实现,如数据驱动、日志、配置文件等AutoUiTestFrame自动化框架的目录结构初步进行规划,目录结构如下:Config 配置文件的目录v  config.ini 配置文件;v  globalconfig.py 获得日志路径、测试用例路径、测试报告路径、测试数据路径;v  Data 测试数据;v  TestData.xlsx 测试数据。Public 公共文件库v  Common 封装的公共的方法n  Commonconfig.py 公共的参数配置:调试过程的测试数据等;n  DoExcel.py 操作excel(数据驱动);n  Send_mail.py 发送邮件(html);n  ReadConfigIni.py 读取ini格式的配置文件;n  TestCaseInfo.py  测试用例信息;n  Log.py 日志类。设置日志类,其他模块或文件需要日志类时,调用该文件。v  Pages 使用po模式设计的测试页面n  BasePage.py  基类,对一些测试页面公共方法、属性的封装及webdrive一些方法的二次封装;n  Bing.py 测试页面。Report 测试报告v  Log 日志目录n  *****log日志。v  TestReport 测试报告目录n  ***html测试报告。TestCase 测试用例v  TC_bing.py。Run.py  控制测试用例的运行。

110,552

社区成员

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

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

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