Ini 配置文件操作
在C#语言中,VS平台并没有给大家提供一个专门用来操作INI配置文件的类。
在本文中主要编写了一个特定的类用来对Ini文件进行操作。
代码:
/// <summary>
/// IniFiles类
/// </summary>
public class IniFiles
{
//声明读写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);
private string FileName; //INI文件名
/// <summary>
/// 构造函数
/// </summary>
/// <param name="AFileName">文件路径</param>
public IniFiles(string filePath)
{
string path = filePath;
FileInfo fileInfo = new FileInfo(path);// 判断文件是否存在
if ((!fileInfo.Exists))
{
using (StreamWriter sw = new StreamWriter(path, false, System.Text.Encoding.Default))
{
try
{
sw.Write("#表格配置档案,请不要修改文件内容!");
sw.Close();
}
catch
{
throw (new ApplicationException("Ini文件不存在"));
}
}
}
//必须是完全路径,不能是相对路径
FileName = fileInfo.FullName;
}
/// <summary>
/// 写文本数据
/// </summary>
/// <param name="Section">根节点</param>
/// <param name="Ident">节点名</param>
/// <param name="Value">默认值</param>
public void WriteString(string Section, string Ident, string Value)
{
if (!WritePrivateProfileString(Section, Ident, Value, FileName))
{
throw (new ApplicationException("写Ini文件出错"));
}
}
/// <summary>
/// 读取文本字段
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Ident">节点名</param>
/// <param name="Default">默认值</param>
/// <returns>文本结果</returns>
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);
int n = 0;
for (int i = 0; i < bufLen ; i++)
{
if (Buffer[i] > 128)
n++;
}
s = s.Substring(0, bufLen - n / 2); //在UNcodexitong中中文算一个字符
return s.Trim();
}
/// <summary>
/// 读整数字段
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Ident">节点名</param>
/// <param name="Default">默认值</param>
/// <returns>整数结果</returns>
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;
}
}
/// <summary>
/// 写整数
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Ident">节点名</param>
/// <param name="Value">节点值</param>
public void WriteInteger(string Section, string Ident, int Value)
{
WriteString(Section, Ident, Value.ToString());
}
/// <summary>
/// 读布尔
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Ident">节点名</param>
/// <param name="Default">默认值</param>
/// <returns>返回布尔值</returns>
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;
}
}
/// <summary>
/// 写布尔值
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Ident">节点名</param>
/// <param name="Value">布尔值</param>
public void WriteBool(string Section, string Ident, bool Value)
{
WriteString(Section, Ident, Convert.ToString(Value));
}
/// <summary>
/// 读取根节点的所有节点名
/// </summary>
/// <param name="Section">根节点名</param>
/// <param name="Idents">字符串集合</param>
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);//从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
}
private static 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;
}
}
}
}
/// <summary>
/// 从Ini文件中,读取所有的Sections的名称
/// </summary>
/// <param name="SectionList"></param>
public void ReadSections(StringCollection SectionList)
{
//Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section
byte[] Buffer = new byte[65535];
int bufLen = GetPrivateProfileString(null, null, null, Buffer, Buffer.GetUpperBound(0), FileName);
GetStringsFromBuffer(Buffer, bufLen, SectionList);
}
/// <summary>
/// 读取指定的Section的所有Value到列表中
/// </summary>
/// <param name="Section"></param>
/// <param name="Values"></param>
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, ""));
}
}
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);
}
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();
}
}
例子:
IniFiles ini = new IniFiles("文件绝对路径!");
string str = ini.ReadString("asd", "asd", "default");