C#-讀取ini文件


第一種方法:

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:日志相關的工具類                                                   
*│ 作    者:執筆小白                                              
*│ 版    本:1.0                                       
*│ 創建時間:2020-6-13 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空間: ZhibiXiaobai.Uril.ConfigFileHelper                               
*│ 類    名:OperateFile_InI                                     
*└──────────────────────────────────────────────────────────────┘
*/
using System.Runtime.InteropServices;
using System.Text;

namespace ZhibiXiaobai.Uril.ConfigFileHelper
{
    /// <summary>
    /// InI文件的讀寫
    /// </summary>
    public class OperateFile_InI
    {
        #region API函數聲明
        /// <summary>
        /// 讀-獲取所有節點名稱(Section)
        /// </summary>
        /// <param name="lpszReturnBuffer">存放節點名稱的內存地址,每個節點之間用\0分隔</param>
        /// <param name="nSize">內存大小(characters)</param>
        /// <param name="lpFileName">Ini文件</param>
        /// <returns>內容的實際長度,為0表示沒有內容,為nSize-2表示內存大小不夠</returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, uint nSize, string lpFileName);

        /// <summary>
        /// 讀-獲取某個指定節點(Section)中所有KEY和Value
        /// </summary>
        /// <param name="lpAppName">節點名稱</param>
        /// <param name="lpReturnedString">返回值的內存地址,每個之間用\0分隔</param>
        /// <param name="nSize">內存大小(characters)</param>
        /// <param name="lpFileName">Ini文件</param>
        /// <returns>內容的實際長度,為0表示沒有內容,為nSize-2表示內存大小不夠</returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);

        /// <summary>
        /// 寫-將指定的鍵值對寫到指定的節點,如果已經存在則替換。
        /// </summary>
        /// <param name="lpAppName">節點,如果不存在此節點,則創建此節點</param>
        /// <param name="lpString">Item鍵值對,多個用\0分隔,形如key1=value1\0key2=value2
        /// <para>如果為string.Empty,則刪除指定節點下的所有內容,保留節點</para>
        /// <para>如果為null,則刪除指定節點下的所有內容,並且刪除該節點</para>
        /// </param>
        /// <param name="lpFileName">INI文件</param>
        /// <returns>是否成功寫入</returns>
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]     //可以沒有此行
        private static extern bool WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);

        /// <summary>
        /// 寫-寫標簽值
        /// </summary>
        /// <param name="section">節點</param>
        /// <param name="key">Key</param>
        /// <param name="val"></param>
        /// <param name="filePath">Ini文件</param>
        /// <returns></returns>
        [DllImport("kernel32", EntryPoint = "WritePrivateProfileString")]  // 返回0表示失敗,非0為成功
        private static extern long WritePrivateProfileString(string section, string key,
            string val, string filePath);

        /// <summary>
        /// 讀-讀標簽值
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <param name="def"></param>
        /// <param name="retVal"></param>
        /// <param name="size">內存大小</param>
        /// <param name="filePath">Ini文件</param>
        /// <returns></returns>
        [DllImport("kernel32", EntryPoint = "GetPrivateProfileString")]  // 返回取得字符串緩沖區的長度
        private static extern long GetPrivateProfileString(string section, string key,
            string def, StringBuilder retVal, int size, string filePath);
        #endregion API函數聲明

        #region 讀Ini文件


        /// <summary>
        /// 讀Ini文件-標簽值
        /// 詳細見INI例子
        /// </summary>
        /// <param name="Section">[Section]標簽的名字</param>
        /// <param name="Key">key</param>
        /// <param name="NoText">未找到值時默認返回的值</param>
        /// <param name="iniFilePath">ini文件的路徑</param>
        /// <returns></returns>
        public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                StringBuilder temp = new StringBuilder(1024);
                GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
                return temp.ToString();
            }
            else
            {
                return String.Empty;
            }
        }

        /// <summary>
        /// 讀取INI文件中指定INI文件中的所有節點名稱(Section)-未測試多線程使用
        /// 最多32767個char
        /// </summary>
        /// <param name="iniFile">Ini文件</param>
        /// <returns>所有節點,沒有內容返回string[0]</returns>
        public static string[] INIGetAllSectionNames(string iniFile)
        {
            uint MAX_BUFFER = 32767;    //默認為32767

            string[] sections = new string[0];      //返回值

            //申請內存
            IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));
            uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, iniFile);
            if (bytesReturned != 0)
            {
                //讀取指定內存的內容
                string local = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned).ToString();

                //每個節點之間用\0分隔,末尾有一個\0
                sections = local.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }

            //釋放內存
            Marshal.FreeCoTaskMem(pReturnedString);

            return sections;
        }

        /// <summary>
        /// 獲取INI文件中指定節點(Section)中的所有條目(key=value形式)-未測試多線程使用
        /// 最多32767個char
        /// </summary>
        /// <param name="iniFile">Ini文件</param>
        /// <param name="section">節點名稱</param>
        /// <returns>指定節點中的所有項目,沒有內容返回string[0]</returns>
        public static string[] INIGetAllItems(string iniFile, string section)
        {
            //返回值形式為 key=value,例如 Color=Red
            uint MAX_BUFFER = 32767;    //默認為32767

            string[] items = new string[0];      //返回值

            //分配內存
            IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER * sizeof(char));

            uint bytesReturned = GetPrivateProfileSection(section, pReturnedString, MAX_BUFFER, iniFile);

            if (!(bytesReturned == MAX_BUFFER - 2) || (bytesReturned == 0))
            {

                string returnedString = Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned);
                items = returnedString.Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
            }

            Marshal.FreeCoTaskMem(pReturnedString);     // 釋放內存

            return items;
        }
        #endregion 讀

        #region 寫Ini文件
        /// <summary>
        /// 寫Ini文件-標簽值
        /// 詳細見INI例子
        /// </summary>
        /// <param name="Section">[Section]標簽的名字</param>
        /// <param name="Key">key</param>
        /// <param name="Value">key對應的Value</param>
        /// <param name="iniFilePath">ini文件的路徑</param>
        /// <returns></returns>
        public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
                return OpStation == 0 ? false : true;
            }
            else
            {
                return false;
            }
        }
        #endregion 寫
    }

    /* DBServer.ini結構如下
     * [Head]
     * Head=Head項不可刪除
     * [Server]
     * Name=localhost
     * [DB]
     * Name=NorthWind
     * [User]
     * Name=sa
     */
}

第二種方法:

  微軟的Configuration Extensions來讀取ini文件。

第三種方法:

  同事寫的文件流讀取的方法:

查看代碼
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace BOZHON.TSAMO.Common.文件操作類
{
    /// <summary>
    /// 僅支持整個程序讀取單個文件,有需要可自己修改
    /// </summary>
    public class ReadIniFileHelper
    {
        private static Dictionary<string, Dictionary<string, string>> IniFileContent;

        public static string message;

        /// <summary>
        /// 初始化讀取
        /// </summary>
        /// <param name="path">文件路徑</param>
        public static void InitializeRead(string path)
        {
            IniFileContent = new Dictionary<string, Dictionary<string, string>>();

            if (!File.Exists(path))
            {
                message = "文件路徑不存在";
                return;
            }

            try
            {
                string[] lines = File.ReadAllLines(path).Select(a => a.Trim()).ToArray();
                Dictionary<string, string> keyValues = null;
                string key = null;
                for (int i = 0; i < lines.Length; i++)
                {
                    string item = lines[i];
                    if (string.IsNullOrEmpty(item))
                    {
                        continue;
                    }

                    try
                    {
                        if (item.First() == '[' && item.Last() == ']')
                        {
                            key = item.Substring(1, item.Length - 2);
                            keyValues = new Dictionary<string, string>();
                            IniFileContent.Add(key, keyValues);
                        }
                        else
                        {
                            keyValues = IniFileContent[key];
                            var array = item.Split('=');
                            keyValues.Add(array[0], array[1]);
                        }
                    }
                    catch
                    {
                        IniFileContent = null;
                        message = $"第{i + 1}行解析異常";
                        return;
                    }
                }

                message = null;
            }
            catch (Exception e)
            {
                IniFileContent = null;
                message = e.ToString();
                return;
            }
        }

        /// <summary>
        /// 指定讀取
        /// </summary>
        /// <param name="section"></param>
        /// <returns>字典</returns>
        public static Dictionary<string, string> ReadValue(string section)
        {
            if (string.IsNullOrEmpty(section))
            {
                message = "參數為空";
                return null;
            }
            if (IniFileContent == null)
            {
                message = "請先執行【InitializeRead】方法";
                return null;
            }
            if (!IniFileContent.ContainsKey(section))
            {
                message = "數據不存在";
                return null;
            }

            message = null;
            return IniFileContent[section];
        }

        /// <summary>
        /// 指定讀取
        /// </summary>
        /// <param name="section"></param>
        /// <param name="key"></param>
        /// <returns>字符串</returns>
        public static string ReadValue(string section, string key)
        {
            if (string.IsNullOrEmpty(section) || string.IsNullOrEmpty(key))
            {
                message = "參數為空";
                return null;
            }
            if (IniFileContent == null)
            {
                message = "請先執行【InitializeRead】方法";
                return null;
            }
            if (!IniFileContent.ContainsKey(section))
            {
                message = "數據不存在";
                return null;
            }

            message = null;
            return IniFileContent[section][key];
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM