首页 > 编程语言 >在C#中配置ini文件以及封装ini类

在C#中配置ini文件以及封装ini类

时间:2024-08-08 23:23:09浏览次数:15  
标签:文件 读取 封装 string 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); // 假设值的最大长度为255
        uint 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.");
        }
    }
}

注意事项:

  1. 字符集WritePrivateProfileStringGetPrivateProfileString 函数都有ANSI和Unicode版本。示例中使用的是Unicode版本(CharSet.Unicode),适用于需要处理Unicode字符的情况。如果你的应用只处理ANSI字符,可以使用 CharSet.Ansi

  2. 返回值GetPrivateProfileString 返回读取的字节数(不包括null终止符)。如果返回值为0,可能表示键或节不存在,或者发生了错误。

  3. 默认值GetPrivateProfileString 的第三个参数是defaultValue,当指定的键不存在时,将返回这个默认值。

  4. 安全性:使用这些函数时,需要确保传递给它们的大小参数足够大,以避免缓冲区溢出。

  5. 错误处理:如果写入或读取失败,可以通过调用 Marshal.GetLastWin32Error() 来获取错误代码。

  6. 文件存在:在使用 WritePrivateProfileStringGetPrivateProfileString 之前,确保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

标签:文件,读取,封装,string,C#,函数,写入,INI,ini
From: https://blog.csdn.net/weixin_64532720/article/details/140999796

相关文章

  • 配置 Containerd 在 harbor 私有仓库拉取镜像
    unexpectedstatuscode[manifests1.28]:401Unauthorized【问题描述】下载Harbor中的私有镜像时报错:[root@lidabaiapp]#ctr-nharbor.lidabaiimagespull192.168.2.22:443/lidabai/busybox:1.28-kctr:failedtoresolvereference"192.168.2.22:443/lidabai/busyb......
  • # Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决
    Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决已经很晚了,刚刚解决这个问题,还是想记录一下,因为刚刚接触cocos没多久,这个问题困扰了我很久。背景接手了一个答题小游戏,由于涉及敏感信息就不在这里截图了,交接到我手里的是用cocos开发的,之前从来没有接触......
  • 11HTML+CSS
    空间:是从坐标轴角度定义的X、Y和Z三条坐标轴构成了一个立体空间,Z轴位置与视线方向相同。l 空间转换也叫3D转换l 属性:transform。属性l取值(正负均可)u像素单位数值u百分比(参照盒子自身尺寸计算结果)l提示l默认情况下,Z轴平移没有效果空间转换–平移tran......
  • 【Playwright+Python】系列教程(八)鉴权Authentication的使用
    写在前面还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。到底是什么意思?就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一遍登录的过程,从而缩......
  • Charles使用教程
     一、Charles教程(一)Charles使用教程Charles是一个HTTP代理/HTTP监视器/反向代理,能够查看其机器和Internet之间的所有HTTP和SSL/HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息)Charles是在Mac/Windows下常用的网络封包截取工具,在做移动开发时,我们为了调试......
  • DispatcherServlet
    DispatcherServlet是SpringMVC框架中的核心组件之一,它扮演着前端控制器的角色。在SpringMVC架构中,所有的HTTP请求都会首先到达DispatcherServlet,然后由它分发到合适的处理器进行处理。下面是一些关于DispatcherServlet的关键点:入口点:每当一个HTTP请求到达Web应......
  • BMC Genomics | 综合代谢组学和转录组学分析揭示了菊花黄酮和咖啡酰奎宁酸的生物合成
    杭白菊是一种流行的药用和食用植物,主要通过黄酮类和咖啡酰奎宁酸(CQAs)的存在发挥其生物活性。然而,菊花头状花序中黄酮和CQA生物合成的调控机制尚不清楚。本研究采用高效液相色谱法测定了菊花头状花序发育过程中黄酮类化合物和CQAs的含量,发现在S1和S2阶段含量较高,在S3~S5阶段含......
  • Creo二次开发(一)
    creovs环境搭建note:配置Debug,release会失败1.安装creo要安装ptoolkit2.vs配置包含目录库目录预处理定义PRO_USE_VAR_ARGS链接器wsock32.libpsapi.libnetapi32.libmpr.libprotk_dllmd_NU.libucore.libudata.libnote:忽略特定默认库库中添加“msvcrt.lib(结合自己......
  • data.includes is not a function
    一.省流:前后端交互的数据格式不一致,前端需要的是一个数组,而后端发送的是一个对象二、情景再现前端需要一个数组,进而显示用户列表letuserList=ref([])由于后端是一星期前写的,写完后端之后就一直在弄前端,所以忘记了后端其实传的的是PageBean对象publicResult<PageBean<......
  • 基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
    ......