INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value) [Section] Key=Value VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类,从网上收集的,很全,就是没有对section的改名功能,高手可以增加一个。 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 key, 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 Ident, string Default) { Byte[] Buffer = new Byte[65535]; int bufLen = GetPrivateProfileString(Section, Ident, 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, string Ident, int Default) { string intStr = ReadString(Section, Ident, Convert.ToString(Default)); try { return Convert.ToInt32(intStr); } catch (Exception ex) { Console.WriteLine(ex.Message); return Default; } } //写整数 public void WriteInteger(string Section, string Ident, int Value) { WriteString(Section, Ident, Value.ToString()); } //读布尔 public bool ReadBool(string Section, string Ident, bool Default) { try { return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default))); } catch (Exception ex) { Console.WriteLine(ex.Message); return Default; } } //写Bool public void WriteBool(string Section, string Ident, bool Value) { WriteString(Section, Ident, 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, null, Buffer, Buffer.GetUpperBound(0), 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, null, null, Buffer, Buffer.GetUpperBound(0), FileName); GetStringsFromBuffer(Buffer, bufLen, 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, key, ""); // sectionValueSplit=sectionValue.Split(splitString); // Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString()); // } //} //清除某个Section public void EraseSection(string Section) { // if (!WritePrivateProfileString(Section, null, null, FileName)) { throw (new ApplicationException("无法清除Ini文件中的Section")); } } //删除某个Section下的键 public void DeleteKey(string Section, string Ident) { WritePrivateProfileString(Section, Ident, null, FileName); } //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件 //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。 public void UpdateFile() { WritePrivateProfileString(null, null, null, FileName); } //检查某个Section下的某个键值是否存在 public bool ValueExists(string Section, string Ident) { // StringCollection Idents = new StringCollection(); ReadSection(Section, Idents); return Idents.IndexOf(Ident) > -1; } //确保资源的释放 ~IniFiles() { UpdateFile(); } } } ***************************************************** ***************************************************** 1. public class INIClass 2. { 3. public string inipath; 4. [DllImport("kernel32")] 5. private static extern long WritePrivateProfileString( 6. string section,string key,string val,string filePath); 7. [DllImport("kernel32")] 8. private static extern int GetPrivateProfileString( 9. string section,string key, 10. string def,StringBuilder retVal, 11. int size,string filePath); 12. /// ﹤summary﹥ 13. /// 构造方法 14. /// ﹤/summary﹥ 15. /// ﹤param name="INIPath"﹥文件路径﹤/param﹥ 16. public INIClass(string INIPath) 17. { 18. inipath = INIPath; 19. } 20. /// ﹤summary﹥ 21. /// 写入INI文件 22. /// ﹤/summary﹥ 23. /// ﹤param name="Section"﹥项目名称(如 [TypeName] )﹤/param﹥ 24. /// ﹤param name="Key"﹥键﹤/param﹥ 25. /// ﹤param name="Value"﹥值﹤/param﹥ 26. public void IniWriteValue(string Section,string Key,string Value) 27. { 28. WritePrivateProfileString(Section,Key,Value,this.inipath); 29. } 30. /// ﹤summary﹥ 31. /// 读出INI文件 32. /// ﹤/summary﹥ 33. /// ﹤param name="Section"﹥项目名称(如 [TypeName] )﹤/param﹥ 34. /// ﹤param name="Key"﹥键﹤/param﹥ 35. public string IniReadValue(string Section,string Key) 36. { 37. StringBuilder temp = new StringBuilder(500); 38. int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath); 39. return temp.ToString(); 40. } 41. /// ﹤summary﹥ 42. /// 验证文件是否存在 43. /// ﹤/summary﹥ 44. /// ﹤returns﹥布尔值﹤/returns﹥ 45. public bool ExistINIFile() 46. { 47. return File.Exists(inipath); 48. } 49. } ******************************************** ******************************************** [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); /*参数说明:section:INI文件中的段落;key:INI文件中的关键字; val:INI文件中关键字的数值;filePath:INI文件的完整的路径和名称。*/ [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); /*参数说明:section:INI文件中的段落名称;key:INI文件中的关键字; def:无法读取时候时候的缺省数值;retVal:读取数值;size:数值的大小; filePath:INI文件的完整路径和名称。*/ string FileName = @"..\..\test.ini"; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { /*对INI文件进行写操作的时候,如果此时在INI文件中存在和 要写入的信息相同的段落名称和关键字,则将覆盖此INI信息。*/ WritePrivateProfileString("段落名称一", "键一", "值一", FileName); WritePrivateProfileString("段落名称二", "键二", "值二", FileName); WritePrivateProfileString("段落名称三", "键三", "值三", FileName); MessageBox.Show("成功写入INI文件!", "信息"); } private void button2_Click(object sender, EventArgs e) { /*正确读取INI的必须满足三个前提:INI文件的全路径、段落名称和关键字名称。 否则就无法正确读取。你可以设定读取不成功后的缺省数值, 在下面的程序中,为了直观设定的是“无法读取对应数值!”字符串。*/ StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString("段落名称一", "键一", "无法读取对应数值!", temp, 255, FileName); int jj = temp.Length; MessageBox.Show("键一=" + temp.ToString()); } private void button3_Click(object sender, EventArgs e) { //删除一个键值 WritePrivateProfileString("段落名称一", "键一", null, FileName); //删除一个段落 WritePrivateProfileString("段落名称一", null, null, FileName); }