加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#读写INI文件的方法

发布时间:2020-12-15 03:48:36 所属栏目:百科 来源:网络整理
导读:本篇章节讲解C#读写INI文件的方法。供大家参考研究。具体如下: 虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中。 IN

本篇章节讲解C#读写INI文件的方法。分享给大家供大家参考。具体如下:

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

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

[Section]
Key=Value

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

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 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 Default)
  {
   Byte[] Buffer = new Byte[65535];
   int bufLen = GetPrivateProfileString(Section,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,int Default)
  {
   string intStr = ReadString(Section,Convert.ToString(Default));
   try
   {
    return Convert.ToInt32(intStr);
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
    return Default;
   }
  }
  //写整数
  public void WriteInteger(string Section,int Value)
  {
   WriteString(Section,Value.ToString());
  }
  //读布尔
  public bool ReadBool(string Section,bool Default)
  {
   try
   {
    return Convert.ToBoolean(ReadString(Section,Convert.ToString(Default)));
   }
   catch (Exception ex)
   {
    Console.WriteLine(ex.Message);
    return Default;
   }
  }
  //写Bool
  public void WriteBool(string Section,bool Value)
  {
   WriteString(Section,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,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,FileName);
   GetStringsFromBuffer(Buffer,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,"");
  //    sectionValueSplit=sectionValue.Split(splitString);
  //    Values.Add(key,sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString());
  //  }
  //}
  //清除某个Section
  public void EraseSection(string Section)
  {
   if (!WritePrivateProfileString(Section,FileName))
   {
    throw (new ApplicationException("无法清除Ini文件中的Section"));
   }
  }
  //删除某个Section下的键
  public void DeleteKey(string Section,string Ident)
  {
   WritePrivateProfileString(Section,FileName);
  }
  //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
  //在Win NT,2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
  //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
  public void UpdateFile()
  {
   WritePrivateProfileString(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文件操作基本上要被xml文件取代了,但是我觉得ini文件的读写仍然是编程的基本,是必须会的

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读