在C#中配置ini文件以及封装ini类
在C#中使用 DllImport
属性从 kernel32.dll
导入函数来写入和读取Windows的INI文件,你可以使用 WritePrivateProfileString
来写入数据,使用 GetPrivateProfileString
来读取数据。
以下是如何使用这些函数的示例:
写入INI文件
using System;
using System.Runtime.InteropServices;
using System.Text;
class Program
{[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]private static extern bool WritePrivateProfileString(string section, string key, string value, string filePath);
static void Main(){string iniFilePath = "example.ini"; // INI文件的路径string section = "Settings"; // 节名称string key = "Resolution"; // 键名称string value = "1920x1080"; // 值
// 调用WritePrivateProfileString函数写入INI文件bool result = WritePrivateProfileString(section, key, value, iniFilePath);
if (result){Console.WriteLine("Write to INI file succeeded.");}else{Console.WriteLine("Write to INI file failed.");}}
}
读取INI文件
using System;
using System.Runtime.InteropServices;
class Program
{[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]private static extern uint GetPrivateProfileString(string section, string key, string defaultValue, StringBuilder retVal, uint size, string filePath);
static void Main(){string iniFilePath = "example.ini"; // INI文件的路径string section = "Settings"; // 节名称string key = "Resolution"; // 键名称
StringBuilder value = new StringBuilder(255); // 假设值的最大长度为255uint bytesRead = GetPrivateProfileString(section, key, "", value, (uint)value.Capacity, iniFilePath);
if (bytesRead > 0){Console.WriteLine($"Value read from INI file: {value.ToString()}");}else{Console.WriteLine("Value not found in INI file.");}}
}
注意事项:
-
字符集:
WritePrivateProfileString
和GetPrivateProfileString
函数都有ANSI和Unicode版本。示例中使用的是Unicode版本(CharSet.Unicode
),适用于需要处理Unicode字符的情况。如果你的应用只处理ANSI字符,可以使用CharSet.Ansi
。 -
返回值:
GetPrivateProfileString
返回读取的字节数(不包括null终止符)。如果返回值为0,可能表示键或节不存在,或者发生了错误。 -
默认值:
GetPrivateProfileString
的第三个参数是defaultValue
,当指定的键不存在时,将返回这个默认值。 -
安全性:使用这些函数时,需要确保传递给它们的大小参数足够大,以避免缓冲区溢出。
-
错误处理:如果写入或读取失败,可以通过调用
Marshal.GetLastWin32Error()
来获取错误代码。 -
文件存在:在使用
WritePrivateProfileString
和GetPrivateProfileString
之前,确保INI文件已经存在。如果文件不存在,写入操作可能会失败。
WritePrivateProfileString是什么
WritePrivateProfileString
是一个Windows API函数,它允许你向一个INI文件中写入数据。INI文件是一种简单的文本文件,用于存储配置数据,通常由应用程序用来存储用户设置和程序参数。
这个函数的原型如下(在Windows API文档或头文件中):
BOOL WritePrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpString, LPCSTR lpFileName
);
参数说明:
-
lpAppName
: 指向一个以null结尾的字符串,指定节的名称。如果这个节不存在,函数将创建它。如果这个参数是NULL
,则指定的键将被写入到INI文件的全局区域(即不在任何节中)。 -
lpKeyName
: 指向一个以null结尾的字符串,指定要写入的键的名称。如果这个键不存在,函数将创建它。如果这个参数是NULL
,则指定的节(lpAppName
)将被删除。 -
lpString
: 指向一个以null结尾的字符串,指定要写入的值。如果这个参数是NULL
,则指定的键将被删除。 -
lpFileName
: 指向一个以null结尾的字符串,指定INI文件的路径。
函数返回值:
-
如果函数成功,返回值是
TRUE
。 -
如果函数失败,返回值是
FALSE
。可以通过调用GetLastError
函数来获取更多错误信息。
使用 WritePrivateProfileString
函数时,需要注意以下几点:
-
函数使用ANSI编码,如果你的应用程序使用Unicode字符,可能需要使用
WritePrivateProfileStringW
,这是WritePrivateProfileString
的宽字符版本。 -
函数在写入时不会自动创建文件,如果指定的INI文件不存在,函数将失败。
-
函数在写入时会覆盖同名的节或键的现有值
GetPrivateProfileString是什么
GetPrivateProfileString
是一个Windows API函数,用于从INI文件中读取配置信息。INI文件是一种包含配置数据的文本文件,通常由应用程序用来存储用户设置和程序参数。这个函数允许你读取INI文件中的特定节(section)和键(key)的值。
函数的原型如下:
DWORD GetPrivateProfileString(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD nSize, LPCSTR lpFileName
);
参数说明:
-
lpAppName
: 指向一个以null结尾的字符串,指定要读取的节的名称。如果指定了节名称,函数将只搜索该节。 -
lpKeyName
: 指向一个以null结尾的字符串,指定要读取的键的名称。如果指定了键名称,函数将只读取该键的值。 -
lpDefault
: 指向一个以null结尾的字符串,指定如果指定的节或键不存在时返回的默认值。 -
lpReturnedString
: 指向一个缓冲区,用于接收读取的字符串。 -
nSize
: 指定lpReturnedString
缓冲区的大小(以字符为单位,包括null终止符)。 -
lpFileName
: 指向一个以null结尾的字符串,指定INI文件的路径。
函数返回值:
-
成功时,返回写入
lpReturnedString
缓冲区的字符数,不包括null终止符。 -
如果失败,返回0。失败可能是由于文件不存在、读取错误或指定的节或键不存在。
在C#中,你可以使用 DllImport
属性来导入这个函数,并使用它来读取INI文件的内容。例如:
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
private static extern uint GetPrivateProfileString(string lpAppName,string lpKeyName,string lpDefault,StringBuilder lpReturnedString,uint nSize,string lpFileName);
然后,你可以创建一个 StringBuilder
实例并指定一个足够大的容量来接收INI文件中的字符串。调用函数后,StringBuilder
将包含读取的值。
INI读写封装
using System;
using System.Runtime.InteropServices;
using System.Text;
public class IniFile
{// 定义INI文件的路径private string filePath;
// 构造函数public IniFile(string iniFilePath){this.filePath = iniFilePath;}
// 导入GetPrivateProfileString函数[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]private static extern uint GetPrivateProfileString(string lpAppName,string lpKeyName,string lpDefault,StringBuilder lpReturnedString,uint nSize,string lpFileName);
// 导入WritePrivateProfileString函数[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]private static extern bool WritePrivateProfileString(string lpAppName,string lpKeyName,string lpString,string lpFileName);
// 读取INI文件中的值public string ReadString(string section, string key, string defaultValue){StringBuilder stringBuilder = new StringBuilder(255);GetPrivateProfileString(section, key, defaultValue, stringBuilder, 255, filePath);return stringBuilder.ToString();}
// 写入INI文件public void WriteString(string section, string key, string value){WritePrivateProfileString(section, key, value, filePath);}
// 读取INI文件中的整数值public int ReadInt(string section, string key, int defaultValue){string value = ReadString(section, key, defaultValue.ToString());return int.TryParse(value, out int result) ? result : defaultValue;}
// 写入INI文件的整数值public void WriteInt(string section, string key, int value){WritePrivateProfileString(section, key, value.ToString(), filePath);}
}
class Program
{static void Main(){// 指定INI文件路径string iniFilePath = "config.ini";
// 创建IniFile对象IniFile iniFile = new IniFile(iniFilePath);
// 写入字符串iniFile.WriteString("Settings", "Username", "user123");iniFile.WriteString("Settings", "Theme", "Dark");
// 读取字符串string username = iniFile.ReadString("Settings", "Username", "defaultUser");string theme = iniFile.ReadString("Settings", "Theme", "Light");
Console.WriteLine($"Username: {username}");Console.WriteLine($"Theme: {theme}");
// 写入整数值iniFile.WriteInt("Settings", "Volume", 70);
// 读取整数值int volume = iniFile.ReadInt("Settings", "Volume", 50);Console.WriteLine($"Volume: {volume}");}
}
这个封装提供了基本的读写功能,包括:
-
ReadString
:读取INI文件中的字符串值。 -
WriteString
:写入INI文件的字符串值。 -
ReadInt
:读取INI文件中的整数值,如果读取失败,返回默认值。 -
WriteInt
:写入INI文件的整数值。
请注意,这个封装示例使用了Unicode字符集(CharSet.Unicode
),适用于处理Unicode字符串。如果你的应用只处理ANSI字符,可以使用 CharSet.Ansi
。
相关文章:
在C#中配置ini文件以及封装ini类
在C#中使用 DllImport 属性从 kernel32.dll 导入函数来写入和读取Windows的INI文件,你可以使用 WritePrivateProfileString 来写入数据,使用 GetPrivateProfileString 来读取数据。 以下是如何使用这些函数的示例: 写入INI文件 using Syst…...

使用git上传代码到github
1、设置用户名及邮箱 git config user.name"你的用户名"git config user.email"xxxxx.com" 2、查看配置 git config -l 3、生成秘钥 ssh-keygen -t rsa 根据上图中红框标出的id_rsa.pub地址,找到它,使用txt文件打开,复…...

滚珠花键:新能源汽车传动系统的核心动力传递者
在日常生活中,汽车已经成为了必不可少的交通工具,尤其是新能源汽车。而滚珠花键作为传动系统中的重要组成部分,在传动系统方面的作用不容忽视。 随着科技的不断发展,汽车行业也在不断进步,滚珠花键作为高精度的机械传动…...
LeetCode 149, 347, 31
文章目录 149. 直线上最多的点数题目链接标签思路总体思路如何判断 一个点 在 由两点确定的直线 上 代码 347. 前 K 个高频元素题目链接标签思路代码 31. 下一个排列题目链接标签思路代码 149. 直线上最多的点数 题目链接 149. 直线上最多的点数 标签 几何 数组 哈希表 数学…...
操作系统(信号处理)
一、信号介绍 什么是中断: 当进程接收到消息后中止当前正在执行的任务,转而执行其它任务,等待其它任务执行完毕后再返回继续执行。这种执行模式称为中断,分为硬件中断和软件中断两种 什么是信号: 信号是UNIX、类UNI…...

[MRCTF2020]Ezpop
[MRCTF2020]Ezpop 题目是pop,考的其实就是pop链,可以自己先学学,啥也不会QAQ php反序列化之pop链_pop3.phpwelcome-CSDN博客 POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法,与二进制利用…...

24暑假算法刷题 | Day27 | 贪心算法 I | LeetCode 455. 分发饼干,376. 摆动序列,53. 最大子数组和
目录 455. 分发饼干题目描述题解 376. 摆动序列题目描述题解 53. 最大子数组和题目描述题解 455. 分发饼干 点此跳转题目链接 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i&#x…...
Golang 的空接口有什么用?
空接口在 Go 语言中具有多种重要用途: 实现通用的数据结构 例如,可以创建一个包含空接口类型元素的切片或映射,从而能够存储不同类型的值。这在处理多种未知类型的数据时非常有用。比如,一个日志系统可能会将不同类型的日志消息&a…...

计算机毕业设计选题推荐-课程教学平台-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

健身日记之倒立俯卧撑学习——起始日2024.6.4
文章目录 目录 前言上期预期 昔日计划 新目标计划 瓶颈突破尝试 参考视频及文章 前言 两个月过去了,已经有所突破了,但是比较预期还是有较大差距,忘记更新csdn了,平时抖音视频号记录的多一些。 上期预期 2024.6.4开始尝试突…...

pikachu文件包含漏洞
一:漏洞基础 程序在引用文件的时,引用的文件名存在可控的情况,传入的文件名没有经过合理的校验或校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入; 文件包含漏洞概念 在PHP程序…...

09.FreeRTOS时间片调度与任务相关函数
文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介: 时间片调度实验流程: 核心代码: 开…...

git分支介绍
git branch 查看当前分支情况 可以看见当前只有一个分支叫main,也就是默认分支,可以理解为树的主干,git早期版本中默认分支叫master 命令行创建一个新分支 git branch [分支名]在创建之后,如果需要切换到新分支需要git switc…...

vm虚拟机下安装CentOS7系统
VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux(centos7)的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言,这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…...

python-报数(赛氪OJ)
[题目描述] 有 n 人围成一圈,顺序排号。 从第 1 个人开始报数(从 1 到 3 报数),凡是报到 3 的人退出圈子,问最后留下的是原来的第几号的那位。输入格式: 初始人数 n 。输出格式: 最后一人的初始…...

灵办AI:智能插件,办公与编程的得力助手
目录 引言一、灵办AI:智能化的办公伙伴二、编程能力:🔥代码阅读,学习助手🔥1、代码解读2、代码续写3、代码优化 三、插件端对话功能:智能交互,流畅体验四、翻译功能:一键翻译&#x…...

食家巷小程序:传统面点与平凉特产的美味盛宴
在美食的世界里,总有一些角落等待着我们去探索,而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点,传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点,每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…...

矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现
最近在处理矢量样本的时候,遇到一些shp文件的坐标系为2000坐标,需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中,有几个关键步骤确保了数据的有效…...

MySQL-InnoDB引擎
目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool(缓冲池) Change Buffer(更改缓冲区) Adaptive Hash Index(自适应hash索引) Log Buffer(日志缓冲区) 磁盘结构 System T…...

【Material-UI】复杂按钮 (Complex Button) 自定义详解
文章目录 一、ButtonBase 组件简介二、实例讲解:创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中,按钮不仅仅是一个点击交互元素,它们也承载着传递信…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...