C#读写INI文件

发布时间:2020-04-12 01:27:49.54编辑:佚名阅读(175)

一、认识INI文件结构

INI文件格式由节、键、值组成。

[section]

参数

(键=值)

name=value

 二、实操

在开发中,有时会遇到对INI文件的读写操作。

针对ini文件写了一个工具类。供大家参考。

引用库函数:

        /// <summary>
        /// 为INI文件中指定的节点取得字符串
        /// </summary>
        /// <param name="lpAppName">欲在其中查找关键字的节点名称</param>
        /// <param name="lpKeyName">欲获取的项名</param>
        /// <param name="lpDefault">指定的项没有找到时返回的默认值</param>
        /// <param name="lpReturnedString">指定一个字串缓冲区,长度至少为nSize</param>
        /// <param name="nSize">指定装载到lpReturnedString缓冲区的最大字符数量</param>
        /// <param name="lpFileName">INI文件完整路径</param>
        /// <returns>复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符</returns>
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
        /// <summary>
        /// 修改INI文件中内容
        /// </summary>
        /// <param name="lpApplicationName">欲在其中写入的节点名称</param>
        /// <param name="lpKeyName">欲设置的项名</param>
        /// <param name="lpString">要写入的新字符串</param>
        /// <param name="lpFileName">INI文件完整路径</param>
        /// <returns>非零表示成功,零表示失败</returns>
        [DllImport("kernel32")]
        private static extern int WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);

读写方法:

        /// <summary>
        /// 读取INI文件值
        /// </summary>
        /// <param name="section">节点名</param>
        /// <param name="key">键</param>
        /// <param name="def">未取到值时返回的默认值</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>读取的值</returns>
        public static string Read(string section, string key, string def, string filePath)
        {
            StringBuilder sb = new StringBuilder(1024);
            GetPrivateProfileString(section, key, def, sb, 1024, filePath);
            return sb.ToString();
        }
        /// <summary>
        /// 写INI文件值
        /// </summary>
        /// <param name="section">欲在其中写入的节点名称</param>
        /// <param name="key">欲设置的项名</param>
        /// <param name="value">要写入的新字符串</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>非零表示成功,零表示失败</returns>
        public static int Write(string section, string key, string value, string filePath)
        {
            CheckPath(filePath);
            return WritePrivateProfileString(section, key, value, filePath);
        }
        /// <summary>
        /// 删除节
        /// </summary>
        /// <param name="section">节点名</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>非零表示成功,零表示失败</returns>
        public static int DeleteSection(string section, string filePath)
        {
            return Write(section, null, null, filePath);
        }
        /// <summary>
        /// 删除键的值
        /// </summary>
        /// <param name="section">节点名</param>
        /// <param name="key">键名</param>
        /// <param name="filePath">INI文件完整路径</param>
        /// <returns>非零表示成功,零表示失败</returns>
        public static int DeleteKey(string section, string key, string filePath)
        {
            return Write(section, key, null, filePath);
        }

在程序根目录创建一个INI文件:

string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sys.ini");//在当前程序路径创建
File.Create(filePath);//创建INI文件

写入内容:

//写入节点1
 INIHelper.Write("s1", "1", "a", filePath);
 INIHelper.Write("s1", "2", "b", filePath);
 INIHelper.Write("s1", "3", "c", filePath);
 //写入节点2
 INIHelper.Write("s2", "4", "d", filePath);
 INIHelper.Write("s2", "5", "e", filePath);
 //改节点值(就是重写一遍)
 INIHelper.Write("s1", "3", "c3", filePath);

读取

//读取节点1中的key为1的值
string value = INIHelper.Read("s1", "1", "789", filePath);

删除节点/键

INIHelper.DeleteKey("s1", "2", filePath);//删除节点s1中key为2的值
INIHelper.DeleteSection("s1", filePath);//删除节点s2

另一个INI文件读写类

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();
  }
 }
}


  关键字:C#读写INI文件


鼓掌

0

正能量

0

0

呵呵

0


评论区