如題:
如何遍歷 ini 文件中所有 Section 及 Key ?C# 操作 ini 文件有沒有相關的系統函數?

解决方案 »

  1.   

    按照常规的XML处理不就好啦。
      

  2.   

    用api,很方便,,网上找的INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]
    key 1 = value2
    key 1 = value2……文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value)。Windows系统自带的Win32的API函数GetPrivateProfileString()和WritePrivateProfileString()分别实现了对INI文件的读写操作,他们位于kernel32.dll下。
    但是令人遗憾的是C#所使用的.NET框架下的公共类库并没有提供直接操作INI文件的类,所以唯一比较理想的方法就是调用API函数。然后,.Net框架下的类库是基于托管代码的,而API函数是基于非托管代码的,(在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。)如何实现托管代码与非托管代码之间的操作呢?.Net框架的System.Runtime.InteropServices命名空间下提供各种各样支持COM interop及平台调用服务的成员,其中最重要的属性之一DllImportAttribute可以用来定义用于访问非托管API的平台调用方法,它提供了对从非托管DLL导出的函数进行调用所必需的信息。下面就来看一下如何实现C#与API函数的互操作。 读操作:[DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath); 
    section:要读取的段落名
    key: 要读取的键
    defVal: 读取异常的情况下的缺省值
    retVal: key所对应的值,如果该key不存在则返回空值
    size: 值允许的大小
    filePath: INI文件的完整路径和文件名写操作:
    [DllImport("kernel32")] 
    private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); 
    section: 要写入的段落名
    key: 要写入的键,如果该key存在则覆盖写入
    val: key所对应的值
    filePath: INI文件的完整路径和文件名          using System;
       using System.Runtime.InteropServices; 
       using System.Text; 
      
       namespace IPVOD.Hotel.Remoting
       {
         
          /// INI文件的操作类
          /// </summary>
         public class IniFile
         {
             public string Path;         public IniFile(string path)
             {
                 this.Path = path;
             }       
             声明读写INI文件的API函数声明读写INI文件的API函数#region 声明读写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          defVal, StringBuilder retVal, int size, string filePath);          [DllImport("kernel32")]
             private static extern int GetPrivateProfileString(string section, string key, string         defVal, Byte[] retVal, int size, string filePath);
             #endregion        
             /// 写INI文件
             /// </summary>
             /// <param name="section">段落</param>
             /// <param name="key">键</param>
            /// <param name="iValue">值</param>
             public void IniWriteValue(string section, string key, string iValue) 
             {
                 WritePrivateProfileString(section, key, iValue, this.Path);
             }        
             /// 读取INI文件
             /// </summary>
             /// <param name="section">段落</param>
             /// <param name="key">键</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();
             }        
             /// 读取INI文件
             /// </summary>
             /// <param name="Section">段,格式[]</param>
             /// <param name="Key">键</param>
             /// <returns>返回byte类型的section组或键值组</returns>
             public byte[] IniReadValues(string section, string key)
             {
                 byte[] temp = new byte[255];             int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path);
                 return temp;
            }
         }
    }
    DLL导出的函数GetPrivateProfileString的重载[DllImport("kernel32")] 
    private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);
    section:要读取的段落名
    key: 要读取的键
    defVal: 读取异常的情况下的缺省值
    retVal: 此参数类型不是string,而是Byte[]用于返回byte类型的section组或键值组。
    size: 值允许的大小
    filePath: INI文件的完整路径和文件名下面看一下具体实例化IniFile类的操作: 
    //path为ini文件的物理路径IniFile ini = new IniFile(path);//读取ini文件的所有段落名byte[] allSection = ini.IniReadValues(null, null);
    通过如下方式转换byte[]类型为string[]数组类型string[] sectionList;ASCIIEncoding ascii = new ASCIIEncoding();//获取自定义设置section中的所有key,byte[]类型sectionByte = ini.IniReadValues("personal", null);//编码所有key的string类型sections = ascii.GetString(sectionByte);//获取key的数组sectionList = sections.Split(new char[1]{'\0'});
    //读取ini文件personal段落的所有键名,返回byte[]类型byte[] sectionByte = ini.IniReadValues("personal", null);
    //读取ini文件evideo段落的MODEL键值model = ini.IniReadValue("evideo", "MODEL");
    //将值eth0写入ini文件evideo段落的DEVICE键ini.IniWriteValue("evideo", "DEVICE", "eth0");即:[evideo]DEVICE = eth0
    //删除ini文件下personal段落下的所有键ini.IniWriteValue("personal", null, null);
    //删除ini文件下所有段落ini.IniWriteValue(null, null, null);
    这样,在就可以使用对他们的调用,用常规的方式定义一个名为IniFile类:
      

  3.   

      string[] _IniText = File.ReadAllLines(@"C:\1.ini", Encoding.Default);            IList<string> _SectionList =new List<string>();
                IList<string> _KeyList =new List<string>();
                for (int i = 0; i != _IniText.Length;i++ )
                {
                    string _Text = _IniText[i].Trim();                if (_Text[0] == '[' && _Text[_Text.Length - 1] == ']')
                    {
                        _SectionList.Add(_Text);
                    }
                    else
                    {
                        _KeyList.Add(_Text.Split('=')[0]);
                    }                
                }
             
      

  4.   

    GetPrivateProfileSectionNames 可以返回所有的session值吧,
    然后调用  GetPrivateProfileString去获取相应的key
    参考
      

  5.   

    [DllImport("kernel32")]
    private static extern bool GetPrivateProfileString(
    string  lpApplicationName,
    string  lpKeyName, 
    string  lpDefault,
    StringBuilder   lpReturnedString ,
    int     nSize,
    string lpFileName);
    StringBuilder strcaption =new StringBuilder(256);
                        StringBuilder strcaption1=new StringBuilder(256);
    if(GetPrivateProfileString("","","",strcaption,strcaption.Capacity,文件地址))
    {
      

  6.   

    public class INIClass 

    public string inipath; 
    [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">文件路径</param> 
    public INIClass(string INIPath) 

    inipath = INIPath; 

    /// <summary> 
    /// 写入INI文件 
    /// </summary> 
    /// <param name="Section">项目名称(如 [TypeName] )</param> 
    /// <param name="Key">键</param> 
    /// <param name="Value">值</param> 
    public void IniWriteValue(string Section,string Key,string Value) 

    WritePrivateProfileString(Section,Key,Value,this.inipath); 

    /// <summary> 
    /// 读出INI文件 
    /// </summary> 
    /// <param name="Section">项目名称</param> 
    /// <param name="Key">键</param> 
    public string IniReadValue(string Section,string Key) 

    StringBuilder temp = new StringBuilder(500); 
    int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath); 
    return temp.ToString(); 

    /// <summary> 
    /// 验证文件是否存在 
    /// </summary> 
    public bool ExistINIFile() 

    return File.Exists(inipath);