C#關於讀寫INI檔案

A1521315qwss發表於2020-09-30

C#關於讀寫INI檔案

什麼是ini檔案就是一個配置檔案,一般把資料庫等配置資訊放進去,然而,改變資料庫的密碼,資料庫名稱,ip等,不要改原始碼重新編譯,只需要用記事本開啟set.ini 檔案,修改儲存即可,不需要修改exe檔案,你也修改不了,
跟java的資料庫配置資訊的properties檔案類似或者springboot的yaml檔案類似,軟編碼的抽取,我的資料庫配置隨時可能動,war包jar包不要動,的好處。

格式是
[Section] 段落
key(鍵)=value(值) 跟java的HashMap類似 鍵值對的形式存在

常用程式碼的積累
在這裡插入圖片描述
專案工程檔案新增兩個類,設成公有的 方便外部呼叫 IniFiles.cs 類和 INIHelper.cs 兩大類
在這裡插入圖片描述

實現效果如下圖
在這裡插入圖片描述
我的主打思想是程式碼寫的再多,你不去呼叫,放在那裡也沒事,呼叫的時候報錯,我們們再去慢慢找錯誤,你寫10個類放在那裡,只呼叫那2個,其他8個類也沒影響,即使空實現也沒事
程式碼積累

INIHelper.cs 類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;

namespace iniFileFrm
{
    public class INIHelper
    {
        /// <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);
        }

        private static void CheckPath(string path)
        {
            string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sys.ini");//在當前程式路徑建立
            File.Create(filePath);//建立INI檔案
        }

    }
}

第二大類

IniFiles.cs 類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;

namespace iniFileFrm
{
    public class IniFiles
    {
        public string inipath;

        //宣告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 def, StringBuilder retVal, int size, string filePath);
        /// <summary> 
        /// 構造方法 
        /// </summary> 
        /// <param name="INIPath">檔案路徑</param> 
        public IniFiles(string INIPath)
        {
            inipath = INIPath;
        }

        public IniFiles() { }

        /// <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">專案名稱(如 [TypeName] )</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> 
        /// <returns>布林值</returns> 
        public bool ExistINIFile()
        {
            return File.Exists(inipath);
        }

    }
}

Form1.cs 主要的程式碼如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace iniFileFrm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string filePath = @"C:/set.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
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            IniFiles f= new IniFiles("./set.ini");
            string demo = f.IniReadValue("SectionDemoTest", "UserName");
            this.textBox1.Text = demo;
        }
    }
}

相關文章