转,出处忘记了,调API,你看看虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中。 INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value) [Section] Key=ValueVC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面我介绍一个读写INI文件的C#类并利用该类保存窗体的坐标,当程序再次运行的时候,窗体将显示在上次退出时的位置。INIFILE类:using System;using System.IO;using System.Runtime.InteropServices;因为我们需要调用API函数,所以必须创建System.Runtime.InteropServices命名空间以提供可用于访问 .NET 中的 COM 对象和本机 API 的类的集合。using System.Text;namespace Ini{ publicclass IniFile { publicstring path; //INI文件名 [DllImport("kernel32")] privatestaticexternlong WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport("kernel32")] privatestaticexternint GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath); //声明读写INI文件的API函数 public IniFile(string INIPath) { path = INIPath; } //类的构造函数,传递INI文件名 publicvoid IniWriteValue(string Section,string Key,string Value) { WritePrivateProfileString(Section,Key,Value,this.path); } //写INI文件 publicstring IniReadValue(string Section,string Key) { StringBuilder temp = new StringBuilder(255); int i = GetPrivateProfileString(Section,Key,"",temp,255,this.path); return temp.ToString(); } //读取INI文件指定 }}
调用INIFILE类:新建一个标准的C# WINDOWS应用程序项目,在窗体中分别增加命名为sect、key、val的三个文本框。增加如下代码:using Ini; //创建命名空间//当窗体关闭时保存窗体坐标privatevoid Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { IniFile ini = new IniFile("C:\\test.ini"); ini.IniWriteValue("LOC" ,"x" ,this.Location.X.ToString() ); ini.IniWriteValue("LOC " ,"y" ,this.Location.Y.ToString() ); //ToString方法将数字转换为字符串 }//当窗体启动时,读取INI文件的值并赋值给窗体 privatevoid Form1_Load(object sender, System.EventArgs e) { IniFile ini = new IniFile("C:\\test.ini"); Point p=new Point() ; if ((ini.IniReadValue ("LOC" ,"x" )!="" ) && (ini.IniReadValue ("LOC" ,"y" )!="")) //判断返回值,避免第一次运行时为空出错 { p.X=int.Parse (ini.IniReadValue ("LOC" ,"x" )); p.Y =int.Parse (ini.IniReadValue ("LOC" ,"y" )); // int.Parse将字符串转换为int this.Location =p; } }
调用INIFILE类:新建一个标准的C# WINDOWS应用程序项目,在窗体中分别增加命名为sect、key、val的三个文本框。增加如下代码:using Ini; //创建命名空间//当窗体关闭时保存窗体坐标privatevoid Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { IniFile ini = new IniFile("C:\\test.ini"); ini.IniWriteValue("LOC" ,"x" ,this.Location.X.ToString() ); ini.IniWriteValue("LOC " ,"y" ,this.Location.Y.ToString() ); //ToString方法将数字转换为字符串 }//当窗体启动时,读取INI文件的值并赋值给窗体 privatevoid Form1_Load(object sender, System.EventArgs e) { IniFile ini = new IniFile("C:\\test.ini"); Point p=new Point() ; if ((ini.IniReadValue ("LOC" ,"x" )!="" ) && (ini.IniReadValue ("LOC" ,"y" )!="")) //判断返回值,避免第一次运行时为空出错 { p.X=int.Parse (ini.IniReadValue ("LOC" ,"x" )); p.Y =int.Parse (ini.IniReadValue ("LOC" ,"y" )); // int.Parse将字符串转换为int this.Location =p; } }
using System.Runtime.InteropServices;
using System.Text;namespace Ini
{
/// <summary>
/// Create a New INI file to store or load data
/// </summary>
public class IniFile
{
public string path; [DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
string key,string val,string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key,string def, StringBuilder retVal,
int size,string filePath); /// <summary>
/// INIFile Constructor.
/// </summary>
/// <PARAM name="INIPath"></PARAM>
public IniFile(string INIPath)
{
path = INIPath;
}
/// <summary>
/// Write Data to the INI File
/// </summary>
/// <PARAM name="Section"></PARAM>
/// Section name
/// <PARAM name="Key"></PARAM>
/// Key Name
/// <PARAM name="Value"></PARAM>
/// Value Name
public void IniWriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.path);
}
/// <summary>
/// Read Data Value From the Ini File
/// </summary>
/// <PARAM name="Section"></PARAM>
/// <PARAM name="Key"></PARAM>
/// <PARAM name="Path"></PARAM>
/// <returns></returns>
public string IniReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,
255, this.path);
return temp.ToString(); }
protected void finalize()
{
}
}
}
/// Ini文件操作的类
/// </summary>
public class IniFile
{
public string path; //INI文件名 //声明读写INI文件的API函数
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
/// <summary>
/// 类的构造函数
/// </summary>
/// <param name="INIPath">INI文件名</param>
public IniFile(string INIPath)
{
path = INIPath;
} /// <summary>
/// 写INI文件
/// </summary>
/// <param name="Section">节</param>
/// <param name="Key">关键字</param>
/// <param name="Value">值</param>
public void WriteValue(string Section,string Key,string Value)
{
WritePrivateProfileString(Section,Key,Value,this.path);
}
/// <summary>
/// 写INI文件
/// </summary>
/// <param name="Section">节</param>
/// <param name="Key">关键字</param>
/// <param name="Value">值</param>
/// <param name="path">ini文件所以路径</param>
public static void WriteValue(string Section,string Key,string Value,string path)
{
WritePrivateProfileString(Section,Key,Value,path);
}
/// <summary>
/// 读取INI文件指定
/// </summary>
/// <param name="Section">节</param>
/// <param name="Key">关键字</param>
/// <returns>指定节-关键字的值</returns>
public string ReadValue(string Section,string Key)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,255,this.path);
return temp.ToString();
} /// <summary>
/// 读取INI文件指定
/// </summary>
/// <param name="Section">节</param>
/// <param name="Key">关键字</param>
/// <returns>指定节-关键字的值</returns>
/// <param name="path">ini文件所在路径</param>
public string ReadValue(string Section,string Key,string path)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section,Key,"",temp,255,path);
return temp.ToString();
} }