首页 > 编程 > C# > 正文

C#读写INI文件的方法

2019-10-29 21:38:00
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#读写INI文件的方法,涉及C#读写ini文件的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

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

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

[Section]

Key=Value

VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类,从网上收集的,很全,就是没有对section的改名功能,高手可以增加一个。

 

 
  1. using System; 
  2. using System.IO; 
  3. using System.Runtime.InteropServices; 
  4. using System.Text; 
  5. using System.Collections; 
  6. using System.Collections.Specialized; 
  7. namespace wuyisky 
  8. /// <summary> 
  9. /// IniFiles的类 
  10. /// </summary> 
  11. public class IniFiles 
  12. public string FileName; //INI文件名 
  13. //声明读写INI文件的API函数 
  14. [DllImport("kernel32")] 
  15. private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath); 
  16. [DllImport("kernel32")] 
  17. private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath); 
  18. //类的构造函数,传递INI文件名 
  19. public IniFiles(string AFileName) 
  20. // 判断文件是否存在 
  21. FileInfo fileInfo = new FileInfo(AFileName); 
  22. //Todo:搞清枚举的用法 
  23. if ((!fileInfo.Exists)) 
  24. //|| (FileAttributes.Directory in fileInfo.Attributes)) 
  25. //文件不存在,建立文件 
  26. System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default); 
  27. try 
  28. sw.Write("#表格配置档案"); 
  29. sw.Close(); 
  30. catch 
  31. throw (new ApplicationException("Ini文件不存在")); 
  32. //必须是完全路径,不能是相对路径 
  33. FileName = fileInfo.FullName; 
  34. //写INI文件 
  35. public void WriteString(string Section, string Ident, string Value) 
  36. if (!WritePrivateProfileString(Section, Ident, Value, FileName)) 
  37. throw (new ApplicationException("写Ini文件出错")); 
  38. //读取INI文件指定 
  39. public string ReadString(string Section, string Ident, string Default) 
  40. Byte[] Buffer = new Byte[65535]; 
  41. int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName); 
  42. //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文 
  43. string s = Encoding.GetEncoding(0).GetString(Buffer); 
  44. s = s.Substring(0, bufLen); 
  45. return s.Trim(); 
  46. //读整数 
  47. public int ReadInteger(string Section, string Ident, int Default) 
  48. string intStr = ReadString(Section, Ident, Convert.ToString(Default)); 
  49. try 
  50. return Convert.ToInt32(intStr); 
  51. catch (Exception ex) 
  52. Console.WriteLine(ex.Message); 
  53. return Default; 
  54. //写整数 
  55. public void WriteInteger(string Section, string Ident, int Value) 
  56. WriteString(Section, Ident, Value.ToString()); 
  57. //读布尔 
  58. public bool ReadBool(string Section, string Ident, bool Default) 
  59. try 
  60. return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default))); 
  61. catch (Exception ex) 
  62. Console.WriteLine(ex.Message); 
  63. return Default; 
  64. //写Bool 
  65. public void WriteBool(string Section, string Ident, bool Value) 
  66. WriteString(Section, Ident, Convert.ToString(Value)); 
  67. //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中 
  68. public void ReadSection(string Section, StringCollection Idents) 
  69. Byte[] Buffer = new Byte[16384]; 
  70. //Idents.Clear(); 
  71. int bufLen = GetPrivateProfileString(Section, nullnull, Buffer, Buffer.GetUpperBound(0), 
  72. FileName); 
  73. //对Section进行解析 
  74. GetStringsFromBuffer(Buffer, bufLen, Idents); 
  75. private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings) 
  76. Strings.Clear(); 
  77. if (bufLen != 0) 
  78. int start = 0; 
  79. for (int i = 0; i < bufLen; i++) 
  80. if ((Buffer[i] == 0) && ((i - start) > 0)) 
  81. String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start); 
  82. Strings.Add(s); 
  83. start = i + 1; 
  84. //从Ini文件中,读取所有的Sections的名称 
  85. public void ReadSections(StringCollection SectionList) 
  86. //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section 
  87. byte[] Buffer = new byte[65535]; 
  88. int bufLen = 0; 
  89. bufLen = GetPrivateProfileString(nullnullnull, Buffer, 
  90. Buffer.GetUpperBound(0), FileName); 
  91. GetStringsFromBuffer(Buffer, bufLen, SectionList); 
  92. //读取指定的Section的所有Value到列表中 
  93. public void ReadSectionValues(string Section, NameValueCollection Values) 
  94. StringCollection KeyList = new StringCollection(); 
  95. ReadSection(Section, KeyList); 
  96. Values.Clear(); 
  97. foreach (string key in KeyList) 
  98. Values.Add(key, ReadString(Section, key, "")); 
  99. ////读取指定的Section的所有Value到列表中, 
  100. //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString) 
  101. //{  string sectionValue; 
  102. //  string[] sectionValueSplit; 
  103. //  StringCollection KeyList = new StringCollection(); 
  104. //  ReadSection(Section, KeyList); 
  105. //  Values.Clear(); 
  106. //  foreach (string key in KeyList) 
  107. //  { 
  108. //    sectionValue=ReadString(Section, key, ""); 
  109. //    sectionValueSplit=sectionValue.Split(splitString); 
  110. //    Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString()); 
  111. //  } 
  112. //} 
  113. //清除某个Section 
  114. public void EraseSection(string Section) 
  115. if (!WritePrivateProfileString(Section, nullnull, FileName)) 
  116. throw (new ApplicationException("无法清除Ini文件中的Section")); 
  117. //删除某个Section下的键 
  118. public void DeleteKey(string Section, string Ident) 
  119. WritePrivateProfileString(Section, Ident, null, FileName); 
  120. //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件 
  121. //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile 
  122. //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。 
  123. public void UpdateFile() 
  124. WritePrivateProfileString(nullnullnull, FileName); 
  125. //检查某个Section下的某个键值是否存在 
  126. public bool ValueExists(string Section, string Ident) 
  127. StringCollection Idents = new StringCollection(); 
  128. ReadSection(Section, Idents); 
  129. return Idents.IndexOf(Ident) > -1; 
  130. //确保资源的释放 
  131. ~IniFiles() 
  132. UpdateFile(); 

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表