C# INI文件的读取

下面举一个常见例子,数据库连接配置INI文件,首先创建config.ini文件,输入如下:
[Database]
Server=127.0.0.1
DB=test_bak
User=sa
Password=123456
创建一个类,如ReadIni,C#使用Ini文件时需要使用API函数。

#region API函数声明

        [DllImport("kernel32")]//返回0表示失败,非0为成功
        private static extern long WritePrivateProfileString(string section, string key,
            string val, string filePath);

        [DllImport("kernel32")]//返回取得字符串缓冲区的长度
        
### C#读取 INI 文件失败解决方案 在处理 C# 读取 INI 文件失败的情况时,通常会遇到多种原因导致此问题的发生。以下是几种常见情况及其对应的解决方案。 #### 编码问题引起的读取失败 当使用 `GetPrivateProfileString` 函数读取 INI 文件时,可能会因为文件编码格式而出现问题。特别是 UTF-8 BOM (Byte Order Mark) 的存在可能导致读取操作完全失效[^4]。对于这种情况: - **检测并去除 BOM** 可以通过编程方式先打开文件流,在读取前判断是否存在 BOM 字符 (`0xEF`, `0xBB`, `0xBF`) 并跳过它们后再继续正常读取剩余部分的数据。 ```csharp using System; using System.IO; class Program { static void Main() { string path = "example.ini"; byte[] bom = new byte[3]; using (FileStream fs = File.OpenRead(path)) { int bytesRead = fs.Read(bom, 0, bom.Length); if(bytesRead >= 3 && bom.SequenceEqual(new byte[]{0xef, 0xbb, 0xbf})) { // Check for BOM presence. Console.WriteLine("BOM detected and skipped."); // Skip the first three bytes which are BOM characters. fs.Seek(3L, SeekOrigin.Begin); using(StreamReader sr = new StreamReader(fs)){ string content = sr.ReadToEnd(); Console.Write(content); } } else{ using(StreamReader sr = new StreamReader(fs)){ string content = sr.ReadToEnd(); Console.Write(content); } } } } } ``` #### 使用 WinAPI 进行读写操作引发的问题 有时即使解决了编码问题,仍然可能由于其他因素造成读取失败。比如路径设置不当或是权限不足等问题。此时建议采用更稳定的方式来进行读写操作——即利用 Windows API 提供的功能来访问 INI 文件中的键值对[^3]。 为了确保能够正确地调用这些 API 方法,应该注意以下几点: - 正确指定目标 INI 文件的位置; - 确认应用程序有足够的权限去修改或查询该位置下的资源; - 验证传给 API 调用的各项参数是否符合预期; 下面是一个简单的例子展示了如何定义外部方法以及编写辅助类以便更好地管理 INI 文件的操作: ```csharp using System; using System.Text; using System.Runtime.InteropServices; public sealed class IniFileHelper { private const uint MAX_BUFFER_SIZE = 32767; [DllImport("kernel32.dll", CharSet=CharSet.Auto)] private static extern long WritePrivateProfileString( string section, string key, string val, string filePath); [DllImport("kernel32.dll", CharSet=CharSet.Auto)] private static extern int GetPrivateProfileString( string section, string key, string defaultValue, StringBuilder resultBuffer, int sizeOfResultBuffer, string filePath); /// <summary> /// Reads a value from an .ini file based on provided parameters. /// </summary> public static string ReadValue(string fileName, string sectionName, string keyName){ var buffer = new StringBuilder((int)MAX_BUFFER_SIZE); GetPrivateProfileString(sectionName, keyName, "", buffer, (int)MAX_BUFFER_SIZE, fileName); return buffer.ToString(); } } ``` 以上代码片段提供了一个静态工具类用于简化与 INI 文件交互的过程,并且已经考虑到了字符集的选择(`CharSet.Auto`)从而适应不同环境下的需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值