C#读写ini文件

C#读写ini文件

调用winAPI 实现ini文件操作

  1. dll路径:C:\Windows\System32\kernel32.dll;
  2. 若调用失败可查看dll是否存在以及环境变量(C:\Windows\System32)是否已设置
  3. 静态类编写如下
    文件采用默认路径,若需要改变,调用之前请先更新文件路径
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace BasicExercises
{
   
   
    /***
     *  ini文件样式
     *  [配置项]
     *  属性1 = 属性值
     *  属性2 = 属性值
     *  ...
     *  
     *  CharSet定义的时候使用了什么类型,在使用相关方法时必须要使用相应的类型 
     *      例如 GetPrivateProfileSectionNames声明为CharSet.Auto,那么就应该使用 Marshal.PtrToStringAuto来读取相关内容 
     *      如果使用的是CharSet.Ansi,就应该使用Marshal.PtrToStringAnsi来读取内容 
     * **/
    class IniConfigHelper
    {
   
   
        static string iniFilePath = Environment.CurrentDirectory+"config.ini";
        public static string IniFilePath {
   
    get => iniFilePath; set => iniFilePath = value; }


        /***
         * 调用winAPI 实现ini文件操作
         * dll路径:C:\Windows\System32\kernel32.dll,若调用失败可查看dll是否存在以及环境变量(C:\Windows\System32)是否已设置
         * 以下是API函数
        ***/


        /// <summary>
        /// 写入ini文件:将指定的键和值写到指定的节点,如果已经存在则替换
        /// </summary>
        /// <param name="section">节点名称</param>
        /// <param name="key">键,null也直接写入</param>
        /// <param name="value">值,null也直接写入</param>
        /// <param name="filePath">ini文件路径</param>
        /// <returns>0失败/其他成功</returns>
        //[DllImport("kernel32", CharSet = CharSet.Auto)]
        //private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);

        /// <summary>
        /// 写入ini文件:将指定的键和值写到指定的节点,如果已经存在则替换
        /// </summary>
        /// <param name="section">节点名称</param>
        /// <param name="key">键,null则删除指定的节点及其所有的项目</param>
        /// <param name="value">值,null则删除指定节点中指定的键</param>
        /// <param name="filePath">ini文件路径</param>
        /// <returns>操作是否成功</returns>
        [DllImport("kernel32", CharSet = CharSet.Auto)]
        private static extern bool WritePrivateProfileString(string section, string key, string value, string filePath);


        /// <summary>
        /// 将指定的键值对写到指定的节点,如果已经存在则替换。
        /// </summary>
        /// <param name="section">节点,如果不存在此节点,则创建此节点</param>
        /// <param name="keyValue">Item键值对,多个用\0分隔,形如key1=value1\0key2=value2 
        ///     如果为string.Empty,则删除指定节点下的所有内容,保留节点
        ///     如果为null,则删除指定节点下的所有内容,并且删除该节点
        ///     该方法无脑写入,遇"\0"换行写入
        /// </param>
        /// <param name="filePath"></param>
        /// <returns>操作成功与否</returns>
        [DllImport("kernel32", CharSet = CharSet.Auto)]
        private static extern bool WritePrivateProfileSection(string section, string keyValue, string filePath);

        /// <summary>
        /// 调用winAPI读取ini文件
        /// </summary>
        /// <param name="section">节点名称</param>
        /// <param name="key">键</param>
        /// <param name="def">值(未读取到数据时设置的默认返回值)</param>
        /// <param name="result">读取的结构值</param>
        /// <param name="size">读取的缓冲区大小</param>
        /// <param name="filePath">ini路径</param>
        /// <returns>读取到的字节数量</returns>
        [DllImport("kernel32", CharSet = CharSet.Auto)]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder result, int size, string filePath);

        /// <summary>
        /// 获取所有节点名称(Section)
        /// </summary>
        /// <param name="ptrResultBuffer">存放节点名称的内存地址,每个节点之间使用\0分隔</param>
        /// <param name="nSize">内存大小</param>
        /// <param name="filePath">ini文件路径</param>
        /// <returns>内容的实际长度,为0表示没有内容,为nSize-2表示内存大小不够</returns>
        [DllImport("kernel32", CharSet = CharSet.
C#读写 INI 文件可以通过自定义方法或使用第三方库实现。INI 文件是一种常见的配置文件格式,结构简单、易于理解。 以下是通过编写代码手动操作 INI 文件的方式: ### 1. 使用 Windows API 操作 INI 文件 Windows 提供了 `GetPrivateProfileString` 和 `WritePrivateProfileString` 函数来处理 INI 配置文件。可以在 C# 程序中调用这些函数完成对 INI读写。 #### 示例代码: ```csharp using System; using System.Runtime.InteropServices; public class IniFileHandler { [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retval, int size, string filePath); [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string value, string filePath); public string FilePath { get; set; } // 构造函数初始化路径 public IniFileHandler(string iniFilePath) { this.FilePath = iniFilePath; } // 写入值到INI文件 public void WriteValue(string section, string key, string value) { WritePrivateProfileString(section, key, value, this.FilePath); } // 从INI文件读取指定键的值 public string ReadValue(string section, string key) { StringBuilder sb = new StringBuilder(256); // 定义缓冲区大小 int length = GetPrivateProfileString(section, key, "", sb, sb.Capacity, this.FilePath); return sb.ToString(); } } // 测试示例 class Program { static void Main() { var handler = new IniFileHandler(@"test.ini"); // 写入数据 handler.WriteValue("Section1", "Key1", "Value1"); // 读取数据 string readResult = handler.ReadValue("Section1", "Key1"); Console.WriteLine($"Read Value: {readResult}"); } } ``` --- ### 2. 自己解析字符串内容 (无依赖) 如果不想引入外部依赖项或者系统API,则可以将 `.ini` 视为普通的文本文件,并自行实现逻辑来加载和保存其中的内容。 #### 范例 - 手动读写 INI 文件 ```csharp System.Collections.Specialized.StringCollection settingsInIniFormat = new System.Collections.Specialized.StringCollection(); settingsInIniFormat.Add("[SectionA]"); settingsInIniFormat.Add("key=value"); ... ``` 然后逐行分析存储的数据并将其转换回字典形式等更易访问的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值