C# 读取ini 文件

本文详细介绍了使用C#调用系统API进行INI文件的读取、写入、修改和删除操作的方法,并提供了用于UI调用的实用方法。

此文章列举了C#调用系统API 对INI文件的添加、读取、修改、删除节点和值的方法和UI调用,ini文件必须是ANSI编码,否则会出现乱码现象。

方法类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections;

namespace ConfigureManager
{
   public class ManagerConfigIni
    {
        private string filePath;
        private bool flag;
        public ManagerConfigIni(string filePath)
        {
            this.filePath = filePath;
        }
        #region 调用windowsAPI
        [DllImport("Kernel32.dll")]
        private static extern int GetPrivateProfileString(string strAppName,string strKeyName,string strDefault,StringBuilder sbReturnString,int nSize,string strFileName);
        [DllImport("Kernel32.dll")]
        private extern static int GetPrivateProfileStringA(string strAppName, string strKeyName, string sDefault, byte[] buffer, int nSize, string strFileName);
        [DllImport("Kernel32.dll")]
        private static extern int GetPrivateProfileInt(string strAppName, string strKeyName, int nDefault, string strFileName);
       //获取ini文件所有的section
        [DllImport("Kernel32.dll")]
        private extern static int GetPrivateProfileSectionNamesA(byte[] buffer, int iLen, string fileName);
        //获取指定Section的key和value       
        [DllImport("Kernel32.dll")]
        private static extern int GetPrivateProfileSection(string lpAppName,byte[] lpReturnedString, int nSize,string lpFileName);
        //根据传入参数的不同进行写入或修改或删除操作(返回值 Long,非零表示成功,零表示失败)
        [DllImport("Kernel32.dll")]
        public static extern long WritePrivateProfileString(string strAppName, string strKeyName, string strKeyValue, string strFileName);
        //添加一个section内容列表
        [DllImport("Kernel32.dll")]
        public static extern long WritePrivateProfileSection(string strAppName, string strkeyandvalue, string strFileName);
        #endregion

        #region 供UI调用的方法
        //判断该ini文件是否存在如果不存在新建一个该文件
        public void FileExists()
        {
            try
            {
                if (!File.Exists(this.filePath))
                {
                    using (FileStream fs = File.Create(this.filePath))
                    {
                        fs.Close();
                    }
                }
             }
            catch(Exception e)
            {

            }
        }
        //返回该配置文件中所有Section名称的集合
        public ArrayList ReadSections()
        {
            byte[] buffer = new byte[65535];
            int rel = GetPrivateProfileSectionNamesA(buffer, buffer.GetUpperBound(0), this.filePath);
            int iCnt, iPos;
            ArrayList arrayList = new ArrayList();
            string tmp;
            if (rel > 0)
            {
                iCnt = 0; iPos = 0;
                for (iCnt = 0; iCnt < rel; iCnt++)
                {
                    if (buffer[iCnt] == 0x00)
                    {
                        tmp = System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt - iPos).Trim();
                        iPos = iCnt + 1;
                        if (tmp != "")
                            arrayList.Add(tmp);
                    }
                }
            }
            return arrayList;
        }
        // 获取指定节点的所有KEY的名称
        public ArrayList ReadKeys(string sectionName)
        {

            byte[] buffer = new byte[5120];
            int rel = GetPrivateProfileStringA(sectionName, null, "", buffer, buffer.GetUpperBound(0), this.filePath);

            int iCnt, iPos;
            ArrayList arrayList = new ArrayList();
            string tmp;
            if (rel > 0)
            {
                iCnt = 0; iPos = 0;
                for (iCnt = 0; iCnt < rel; iCnt++)
                {
                    if (buffer[iCnt] == 0x00)
                    {
                        tmp = System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt - iPos).Trim();
                        iPos = iCnt + 1;
                        if (tmp != "")
                            arrayList.Add(tmp);
                    }
                }
            }
            return arrayList;
        }
        //读取指定节点下的指定key的value返回string
        public string GetIniKeyValueForStr(string section, string key)
        {
            if (section.Trim().Length <= 0 || key.Trim().Length <= 0) return string.Empty;
            StringBuilder strTemp = new StringBuilder(256);
            GetPrivateProfileString(section, key, string.Empty, strTemp, 256, this.filePath);
            return strTemp.ToString().Trim();
        }
        //从指定的节点中获取一个整数值( Long,找到的key的值;如指定的key未找到,就返回默认值。如找到的数字不是一个合法的整数,函数会返回其中合法的一部分。如,对于“xyz=55zz”这个条目,函数返回55。)
        public int GetIniKeyValueForInt(string section, string key)
        {
            if (section.Trim().Length <= 0 || key.Trim().Length <= 0) return 0;
            return GetPrivateProfileInt(section, key, 0, this.filePath);
        }
        //读取指定节点下的所有key 和value
        public ArrayList GetIniSectionValue(string section)
        {
            byte[] buffer = new byte[5120];
            int rel = GetPrivateProfileSection(section, buffer, buffer.GetUpperBound(0), this.filePath);

            int iCnt, iPos;
            ArrayList arrayList = new ArrayList();
            string tmp;
            if (rel > 0)
            {
                iCnt = 0; iPos = 0;
                for (iCnt = 0; iCnt < rel; iCnt++)
                {
                    if (buffer[iCnt] == 0x00)
                    {
                        tmp = System.Text.ASCIIEncoding.Default.GetString(buffer, iPos, iCnt - iPos).Trim();
                        iPos = iCnt + 1;
                        if (tmp != "")
                            arrayList.Add(tmp);
                    }
                }
            }
            return arrayList;
        }
        //往指定section的key中写入value
        public bool WriteIniKey(string section, string key, string value)
        {
            try
            {
                if (section.Trim().Length <= 0 || key.Trim().Length <= 0 || value.Trim().Length <= 0)
                {
                    flag = false;
                }
                else
                {
                 
                    if (WritePrivateProfileString(section, key, value, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        //修改指定section的key的值
        public bool EditIniKey(string section, string key, string value)
        {
            try
            {
                if (section.Trim().Length <= 0 || key.Trim().Length <= 0 || value.Trim().Length <= 0)
                {
                    flag = false;
                }
                else
                {
                    if (WritePrivateProfileString(section, key, value, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        //删除指定section的指定key
        public bool DeleteIniKey(string section, string key)
        {
            try
            {
                if (section.Trim().Length <= 0 || key.Trim().Length <= 0)
                {
                    flag = false;
                }
                else
                {
                    if (WritePrivateProfileString(section, key, null, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        //删除指定section
        public bool DeleteIniSection(string section)
        {
            try
            {
                if (section.Trim().Length <= 0)
                {
                    flag = false;
                }
                else
                {
                    if (WritePrivateProfileString(section, null, null, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }
                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        //给一个节点写入key和value列表
        public bool WriteIniSectionAndValue(string section, Hashtable ht)
        {
            string lpString = "";
            try
            {
                if (section.Trim().Length <= 0 || ht.Count == 0)
                {
                    flag = false;
                }
                else
                {
                    foreach (DictionaryEntry de in ht)
                    {
                        lpString += de.Key+"="+de.Value;                     
                        lpString += "\r\n";
                    }
                    if (WritePrivateProfileSection(section, lpString, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }

                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        //给一个节点写入key 列表
        public bool WriteIniSectionName(string section, List<string> lstKeyValue)
        {
            string lpString = "";
            try
            {
                if (section.Trim().Length <= 0 || lstKeyValue.Count == 0)
                {
                    flag = false;
                }
                else
                {
                    for (int i = 0; i < lstKeyValue.Count; ++i)
                    {
                        lpString += lstKeyValue[i];
                        lpString += "\r\n";
                    }
                    if (WritePrivateProfileSection(section, lpString, this.filePath) == 0)
                    {
                        flag = false;
                    }
                    else
                    {
                        flag = true;
                    }

                }
            }
            catch
            {
                flag = false;
            }
            return flag;
        }
        #endregion
    }
}

<think>我们被要求使用C#读取INI文件。根据引用,我们可以看到几个关点: 1. 引用[1]提到C#读取ini文件对操作,并提到虽然微软推荐使用注册表或.NET配置文件,但有时仍会使用INI。 2. 引用[2]和[3]提供了具体的代码示例,包括写INI文件和读INI文件的方法。 3. 引用[4]也提到了读取INI文件的方法。 由于C#本身没有直接操作INI文件的类,我们需要使用Windows API函数。主要用到的两个函数是: - `GetPrivateProfileString`:读取INI文件中的。 - `WritePrivateProfileString`:向INI文件写入。 我们将按照以下步骤进行: 1. 导入这两个API函数(使用DllImport)。 2. 封装读取和写入的方法。 注意:INI文件的结构是分节的,每节下有不同的对。 下面是一个完整的示例,包括读取和写入INI文件的方法:</think>### C# 读取 INI 文件的方法 在 C#读取 INI 文件需要调用 Windows API 函数,因为 .NET Framework 本身不提供原生支持。以下是完整实现方案: #### 1. 声明 API 函数 ```csharp using System.Runtime.InteropServices; using System.Text; public class IniHelper { [DllImport("kernel32")] private static extern int GetPrivateProfileString( string section, string key, string def, StringBuilder retVal, int size, string filePath); [DllImport("kernel32")] private static extern long WritePrivateProfileString( string section, string key, string val, string filePath); } ``` #### 2. 读取 INI 的方法 ```csharp public static string GetValue(string section, string key, string defaultValue, string filePath) { const int bufferSize = 255; var temp = new StringBuilder(bufferSize); int ret = GetPrivateProfileString( section, key, defaultValue, temp, bufferSize, filePath ); return temp.ToString(); } ``` #### 3. 写入 INI 的方法 ```csharp public static bool SetValue(string section, string key, string value, string filePath) { long result = WritePrivateProfileString(section, key, value, filePath); return result != 0; // 返回操作是否成功 } ``` #### 4. 使用示例 ```csharp // 读取配置 string configFile = @"C:\App\config.ini"; string server = IniHelper.GetValue("Database", "Server", "localhost", configFile); string port = IniHelper.GetValue("Database", "Port", "1433", configFile); // 写入配置 bool success = IniHelper.SetValue("Logging", "Level", "Debug", configFile); ``` #### 注意事项: 1. **文件路径**:需使用物理路径(相对路径或绝对路径) 2. **默认**:当不存在时返回预设的默认 3. **缓冲区大小**:`StringBuilder` 初始化长度决定最大读取长度 4. **字符编码**:API 默认使用系统 ANSI 编码,如需 UTF-8 需额外处理[^1] > 关原理:通过 `kernel32.dll` 的 `GetPrivateProfileString` API 实现跨进程配置读取,该函数直接解析 INI 文件结构[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值