- 第一种
//补充:
//using System;
//using System.Runtime.InteropServices;
//using System.Text;
//using System.Collections;
//using System.Collections.Specialized;
//namespace wuyisky
//{
/**/
/**/
/**/
///
/// IniFiles的类
///
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(); } } }
}
- 第二种
/// <summary>
///Class2 的摘要说明
/// </summary>
public class Class2
{
//
//TODO: 在此处添加构造函数逻辑
//
[DllImport("kernel32.dll")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
public Class2()
{}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name=^Section^>节点名称</param>
/// <param name=^Key^>关键字</param>
/// <param name=^Value^>值</param>
/// <param name=^filepath^>INI文件路径</param>
static public void IniWriteValue(string Section, string Key, string Value, string filepath)
{ WritePrivateProfileString(Section, Key, Value, filepath); }
/// <summary>
/// 读取INI文件
/// </summary>
/// <param name=^Section^>节点名称</param>
/// <param name=^Key^>关键字</param>
/// <param name=^filepath^>INI文件路径</param>
/// <returns>值</returns>
static public string IniReadValue(string Section, string Key, string filepath)
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, "", temp,255, filepath);
return temp.ToString();
}
}
//ini 文档格式路径假设为 D:/SETUP.ini [SQL] SVRName=192.168.1.11\SQL2005 读取实例
// IniReadValue("SQL", "SVRName"," D:/SETUP.ini"); 这样读取出来的值是192.168.1.11\SQL2005 写的话类似
// IniReadValue("SQL", "SVRName","你要写入的值"," D:/SETUP.ini");
- 第三种
/// <summary>
/// 读写INI文件的类。
/// </summary>
public class INIHelper
{
// 读写INI文件相关。
[DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]
public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString", CharSet = CharSet.Ansi)]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSectionNames", CharSet = CharSet.Ansi)]
public static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, int nSize, string filePath);
//[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSectionNames", CharSet = CharSet.Ansi)]
//public static extern int GetPrivateProfileSectionNames(byte[] lpszReturnBuffer, int nSize, string filePath);
[DllImport("KERNEL32.DLL ", EntryPoint = "GetPrivateProfileSection", CharSet = CharSet.Ansi)]
public static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string filePath);
/// <summary>
/// 向INI写入数据。
/// </summary>
/// <PARAM name="Section">节点名。</PARAM>
/// <PARAM name="Key">键名。</PARAM>
/// <PARAM name="Value">值名。</PARAM>
public static void Write(string Section, string Key, string Value, string path)
{
INIHelper.WritePrivateProfileString(Section, Key, Value, path);
}
/// <summary>
/// 读取INI数据。
/// </summary>
/// <PARAM name="Section">节点名。</PARAM>
/// <PARAM name="Key">键名。</PARAM>
/// <PARAM name="Path">值名。</PARAM>
/// <returns>相应的值。</returns>
public static string Read(string Section, string Key, string path)
{
StringBuilder temp = new StringBuilder(255);
int i = INIHelper.GetPrivateProfileString(Section, Key, "", temp, 255, path);
return temp.ToString();
}
/// <summary>
/// 读取一个ini里面所有的节
/// </summary>
/// <param name="sections"></param>
/// <param name="path"></param>
/// <returns></returns>
public static int GetAllSectionNames(out string[] sections, string path)
{
int MAX_BUFFER = 32767;
IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
int bytesReturned = INIHelper.GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
if (bytesReturned == 0)
{
sections = null;
return -1;
}
string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
Marshal.FreeCoTaskMem(pReturnedString);
//use of Substring below removes terminating null for split
sections = local.Substring(0, local.Length - 1).Split('\0');
return 0;
}
//public static int GetAllSectionNames(out string[] sections, string path)
//{
// byte[] buff = new byte[1024];
// Win32Api.GetPrivateProfileSectionNames(buff, buff.Length, path);
// String s = System.Text.Encoding.Default.GetString(buff);
// String[] names = s.Split('\0');
// int count = 0;
// foreach (String name in names)
// {
// if (name == "")
// break;
// count++;
// }
// sections = new string[count];
// Array.Copy(names, sections, count);
// return 0;
//}
/// <summary>
/// 得到某个节点下面所有的key和value组合
/// </summary>
/// <param name="section"></param>
/// <param name="keys"></param>
/// <param name="values"></param>
/// <param name="path"></param>
/// <returns></returns>
public static int GetAllKeyValues(string section, out string[] keys, out string[] values, string path)
{
byte[] b = new byte[65535];
INIHelper.GetPrivateProfileSection(section, b, b.Length, path);
string s = System.Text.Encoding.Default.GetString(b);
string[] tmp = s.Split((char)0);
ArrayList result = new ArrayList();
foreach (string r in tmp)
{
if (r != string.Empty)
result.Add(r);
}
keys = new string[result.Count];
values = new string[result.Count];
for (int i = 0; i < result.Count; i++)
{
string[] item = result[i].ToString().Split(new char[] { '=' });
if (item.Length == 2)
{
keys[i] = item[0].Trim();
values[i] = item[1].Trim();
}
else if (item.Length == 1)
{
keys[i] = item[0].Trim();
values[i] = "";
}
else if (item.Length == 0)
{
keys[i] = "";
values[i] = "";
}
}
return 0;
}
}