`
doxingg
  • 浏览: 5410 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

C#操作ini文件

 
阅读更多

转自:http://www.cnblogs.com/gaohades/archive/2006/01/24/322751.html

          http://llxlett.blog.163.com/blog/static/4192736320113323918484/

INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下:

[Section1]
key 
1 = value2
key 
1 = value2
……
[Section2]
key 
1 = value1
key 
2 = value2
……

文件由若干个段落(section)组成,每个段落又分成若干个key)和值(value)。Windows系统自带的Win32API函数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文件的完整路径和文件名

 

 

 

2、 INI文件的fileName必须使用绝对路径,说明如下

If the lpFileName parameter does not contain a full path and file name for the file,
WritePrivateProfileString searches the Windows directory for the file. 
If the file does not exist,this function creates the file in the Windows directory.

 

3、封装的方法中,最有价值的是获取所有Sections和所有的Keys,网上关于这个的代码大部分是错误的,这里给出一个正确的方法:

 

/// 返回该配置文件中所有Section名称的集合

public ArrayList ReadSections() {
byte[] buffer = new byte[65535];
int rel = GetPrivateProfileSectionNamesA(buffer, buffer.GetUpperBound(0), _FileName);
int iCnt, iPos;
ArrayList arrayList = new ArrayList();
string tmp;
if (rel>0) {
iCnt = 0; iPos = 0; 
for (iCnt = 0; iCnt < rel; iCnt++) {
if (buffer[iCnt] == 0x00) {
tmp =System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt-iPos ).Trim();
iPos = iCnt + 1;
if (tmp != "")
arrayList.Add(tmp);
}
}
}
return arrayList;
}

// 获取节点的所有KEY值

public ArrayList ReadKeys(string sectionName) {

byte[] buffer = new byte[5120];
int rel = GetPrivateProfileStringA(sectionName, null, "", buffer, buffer.GetUpperBound(0), _FileName);

int iCnt, iPos;
ArrayList arrayList = new ArrayList();
string tmp;
if (rel > 0) {
iCnt = 0; iPos = 0;
for (iCnt = 0; iCnt < rel; iCnt++) {
if (buffer[iCnt] == 0x00) {
tmp = System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt-iPos).Trim();
iPos = iCnt + 1;
if (tmp != "")
arrayList.Add(tmp);
}
}
}
return arrayList;
}

 

4、批判网上一个常见的代码范例

public string ReadString(string Section, string Key) {
StringBuilder buffer= new StringBuilder(65535); 
GetPrivateProfileString(Section, Key, "", buffer, buffer.Capacity, _FileName); 
return buffer.ToString(); 
}

用StringBuilder只能读出第一行,不是一个好的写法,正确的做法应该是用char[],因为返回的是一个二进制的串,字符串之间是用"\0"分隔的,具体的见我前面的代码。

分享到:
评论

相关推荐

    C# 操作INI 文件

    2. C#操作INI文件的库 .NET Framework并未内置直接操作INI文件的类,但可以通过使用`System.IO`命名空间中的类如`StreamReader`、`StreamWriter`来实现。另外,也有一些开源库如`IniFile`简化了这一过程。 3. 使用...

    C#操作INI文件源码.rar.rar

    标题 "C#操作INI文件源码.rar.rar" 暗示了这个压缩包包含了一些C#编程语言用于读写INI配置文件的源代码。INI文件是一种传统的文本配置文件格式,通常用于存储应用程序的设置和配置信息。在Windows系统中,这种格式被...

    C#操作INI文件

    总之,C#操作INI文件涉及了对Windows API的使用,通过P/Invoke调用底层函数来实现读写操作。这种技术虽然原始,但在某些场景下仍然实用,特别是在处理遗留系统或需要与旧代码兼容时。通过熟练掌握这些知识,开发者...

    C#操作INI文件源码-K2X.rar

    在本压缩包"C#操作INI文件源码-K2X.rar"中,包含了使用C#语言操作INI文件的源代码示例。下面我们将详细探讨C#操作INI文件的相关知识点。 1. INI文件结构: INI文件是一种简单易读的文本文件,通常包含多个节...

    C#操作INI文件源码-zf.rar

    标题 "C#操作INI文件源码-zf.rar" 指的是一个使用C#编程语言编写的源代码,专门用于处理INI配置文件的程序。INI文件是一种简单的文本格式,常用于存储应用程序的设置和配置信息。这个压缩包包含了实现这些功能的源...

    C# 操作ini文件

    下面将详细解释标题和描述中提及的C#操作INI文件的方法。 首先,我们来看提供的代码段,它定义了一个名为`IniFile`的类,用于封装对INI文件的操作。这个类有两个重要的方法:`IniWriteValue`用于写入数据,`...

    C#操作INI文件源码2019

    在IT行业中,C#是一种广泛使用的编程语言,尤其在Windows应用程序开发中占据着核心地位。本文将深入探讨如何使用C#来...这些内容与C#操作INI文件的主题关联性不大,但在处理Office文档或进行文件解析时是重要的知识点。

    C#操作INI文件源码

    在.NET框架中,C#是一种常用的编程语言,用于开发各种应用程序。...以上就是关于C#操作INI文件的基本知识,包括读取、写入和修改文件的方法。在实际项目中,可以根据需求进行优化和扩展,以适应更复杂的配置需求。

    c#操作ini文件

    下面是一个简单的C#类,封装了这两个API函数,便于操作INI文件: ```csharp public class INIClass { private string inipath; [DllImport("kernel32")] private static extern long ...

    C#操作INI文件源码--值得下载

    本资源提供的是C#操作INI配置文件的源代码,对于理解和学习如何在C#程序中读写INI文件非常有帮助。INI文件是早期Windows系统中用于存储应用程序设置的一种简单文本文件格式,至今仍被许多开发者用于轻量级配置需求。...

    C# 操作INI文件

    C# 操作INI文件 辅助类 操作非常方便。

    C#操作ini文件的类库

    本类库就是针对C#操作ini文件而设计的,旨在简化 ini 文件的读写任务。 在C#中,我们可以创建一个名为`IniFile`的类,该类包含以下功能: 1. **读取ini文件**:`IniFile`类可以提供一个方法如`Load(string ...

    C#操作INI文件源码实例教程.rar

    在.NET框架中,C#是一种常用的编程语言,用于开发各种应用程序。...通过以上介绍,你应该掌握了C#操作INI文件的基本技巧。实际应用中,你可以根据项目需求进行调整,或者选择合适的第三方库来简化工作。

    C#操作ini文件(源码)

    总结来说,C#操作INI文件的关键在于理解文件结构,并利用C#的文件读写功能来实现对INI文件的读取、写入、修改和删除等操作。通过编写自定义函数,可以封装这些操作,使得在实际开发中更加便捷。对于初学者而言,理解...

    C#操作INI文件完整类

    综上所述,`C#操作INI文件完整类`的实现旨在提供一个方便、灵活的方式来读写传统的INI配置文件,使开发者能够在不依赖第三方库的情况下,轻松地管理和更新应用程序的配置。这个类的设计考虑了INI文件的基本结构,并...

    c#操作ini文件的类库

    c#操作ini文件的类库,实现了读取节点,节点赋值,读取节点的所有键值,删除节点、删除键、删除ini文件,创建ini文件等功能。可以直接开箱即用。ini文件结构: 节(section) 节用方括号括起来,单独占一行,例如: ...

    C#操作INI文件,读写注册表

    C#操作INI文件,读写注册表,可以完成选择INI文件、写入INI文件、读取ini文件。在读取INI时,请先输入section和key的值再点击,可以读取出INI文件节点中各个值的详细信息,作为一个大型的应用,配置文件的写入非常...

    C#操作INI文件源码(201903)

    标题 "C#操作INI文件源码(201903)" 暗示着这是一个关于使用C#编程语言处理INI配置文件的代码资源。INI文件是早期Windows系统中广泛使用的文本格式,用于存储应用程序的配置设置。这些文件通常包含键值对,易于读写,...

Global site tag (gtag.js) - Google Analytics