C# · 12月 28, 2021

C#读写INI文件的方法

本文实例讲述了C#读写INI文件的方法。分享给大家供大家参考。具体如下:@H_502_1@

虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中。@H_502_1@

INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value)@H_502_1@

[Section]
Key=Value@H_502_1@

VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类,从网上收集的,很全,就是没有对section的改名功能,高手可以增加一个。@H_502_1@using System;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Collections;using System.Collections.Specialized;namespace wuyisky{ /// <summary> /// IniFiles的类 /// </summary> public class IniFiles { public string FileName; //INI文件名 //声明读写INI文件的API函数 [DllImport(“kernel32”)] private static extern bool WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport(“kernel32”)] private static extern int GetPrivateProfileString(string section,string def,byte[] retVal,int size,string filePath); //类的构造函数,传递INI文件名 public IniFiles(string AFileName) { // 判断文件是否存在 FileInfo fileInfo = new FileInfo(AFileName); //Todo:搞清枚举的用法 if ((!fileInfo.Exists)) { //|| (FileAttributes.Directory in fileInfo.Attributes)) //文件不存在,建立文件 System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName,false,System.Text.Encoding.Default); try { sw.Write(“#表格配置档案”); sw.Close(); } catch { throw (new ApplicationException(“Ini文件不存在”)); } } //必须是完全路径,不能是相对路径 FileName = fileInfo.FullName; } //写INI文件 public void WriteString(string Section,string Ident,string Value) { if (!WritePrivateProfileString(Section,Ident,Value,FileName)) { throw (new ApplicationException(“写Ini文件出错”)); } } //读取INI文件指定 public string ReadString(string Section,string Default) { Byte[] Buffer = new Byte[65535]; int bufLen = GetPrivateProfileString(Section,Default,Buffer,Buffer.GetUpperBound(0),FileName); //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文 string s = Encoding.GetEncoding(0).GetString(Buffer); s = s.Substring(0,bufLen); return s.Trim(); } //读整数 public int ReadInteger(string Section,int Default) { string intStr = ReadString(Section,Convert.ToString(Default)); try { return Convert.ToInt32(intStr); } catch (Exception ex) { Console.WriteLine(ex.Message); return Default; } } //写整数 public void WriteInteger(string Section,int Value) { WriteString(Section,Value.ToString()); } //读布尔 public bool ReadBool(string Section,bool Default) { try { return Convert.ToBoolean(ReadString(Section,Convert.ToString(Default))); } catch (Exception ex) { Console.WriteLine(ex.Message); return Default; } } //写Bool public void WriteBool(string Section,bool Value) { WriteString(Section,Convert.ToString(Value)); } //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中 public void ReadSection(string Section,StringCollection Idents) { Byte[] Buffer = new Byte[16384]; //Idents.Clear(); int bufLen = GetPrivateProfileString(Section,null,FileName); //对Section进行解析 GetStringsFromBuffer(Buffer,bufLen,Idents); } private void GetStringsFromBuffer(Byte[] Buffer,int bufLen,StringCollection Strings) { Strings.Clear(); if (bufLen != 0) { int start = 0; for (int i = 0; i < bufLen; i++) { if ((Buffer[i] == 0) && ((i – start) > 0)) { String s = Encoding.GetEncoding(0).GetString(Buffer,start,i – start); Strings.Add(s); start = i + 1; } } } } //从Ini文件中,读取所有的Sections的名称 public void ReadSections(StringCollection SectionList) { //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section byte[] Buffer = new byte[65535]; int bufLen = 0; bufLen = GetPrivateProfileString(null,FileName); GetStringsFromBuffer(Buffer,SectionList); } //读取指定的Section的所有Value到列表中 public void ReadSectionValues(string Section,NameValueCollection Values) { StringCollection KeyList = new StringCollection(); ReadSection(Section,KeyList); Values.Clear(); foreach (string key in KeyList) { Values.Add(key,ReadString(Section,key,””)); } } ////读取指定的Section的所有Value到列表中, //public void ReadSectionValues(string Section,NameValueCollection Values,char splitString) //{  string sectionValue; //  string[] sectionValueSplit; //  StringCollection KeyList = new StringCollection(); //  ReadSection(Section,KeyList); //  Values.Clear(); //  foreach (string key in KeyList) //  { //    sectionValue=ReadString(Section,””); //    sectionValueSplit=sectionValue.Split(splitString); //    Values.Add(key,sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString()); //  } //} //清除某个Section public void EraseSection(string Section) { if (!WritePrivateProfileString(Section,FileName)) { throw (new ApplicationException(“无法清除Ini文件中的Section”)); } } //删除某个Section下的键 public void DeleteKey(string Section,string Ident) { WritePrivateProfileString(Section,FileName); } //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件 //在Win NT,2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。 public void UpdateFile() { WritePrivateProfileString(null,FileName); } //检查某个Section下的某个键值是否存在 public bool ValueExists(string Section,string Ident) { StringCollection Idents = new StringCollection(); ReadSection(Section,Idents); return Idents.IndexOf(Ident) > -1; } //确保资源的释放 ~IniFiles() { UpdateFile(); } }}

目前C# 对ini文件操作基本上要被xml文件取代了,但是我觉得ini文件的读写仍然是编程的基本,是必须会的@H_502_1@

希望本文所述对大家的C#程序设计有所帮助。@H_502_1@