当前位置:首页 > 行业动态 > 正文

如何在C中使用Windows API读写INI文件?

摘要:C#中利用Windows API读写INI文件,需先引用相关命名空间,再通过调用API函数实现对INI文件的读取和写入操作。

在C#中,可以利用Windows API来实现对INI文件的读写操作,以下是具体的实现方法:

如何在C中使用Windows API读写INI文件?  第1张

引入必要的命名空间

需要引入System.Runtime.InteropServices命名空间,以便使用DllImport特性来调用Windows API函数。

using System;
using System.Runtime.InteropServices;

定义常量和结构体

为了调用Windows API函数,需要定义一些常量和结构体来表示相关的参数和返回值。

public class IniFile
{
    // 定义常量
    public const int MAX_PATH = 260;
    public const int ERROR_INSUFFICIENT_BUFFER = 122;
    // 定义结构体
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct TCHAR
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
        public string Value;
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct KEY_VALUE_FULL_INFORMATION
    {
        public uint Type;
        public uint DataOffset;
        public uint DataLength;
        public uint Flags;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
        public byte[] Name;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
        public byte[] Data;
    }
}

声明Windows API函数

使用DllImport特性声明需要调用的Windows API函数。

public class IniFile
{
    // 其他代码...
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool GetPrivateProfileSectionNames(TCHAR lpAppName, TCHAR lpReturnedString, int nSize, string lpFileName);
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetPrivateProfileSection(TCHAR lpAppName, TCHAR lpReturnedString, int nSize, string lpFileName);
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int GetPrivateProfileString(TCHAR lpAppName, TCHAR lpKeyName, TCHAR lpDefault, TCHAR lpReturnedString, int nSize, string lpFileName);
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool WritePrivateProfileSection(TCHAR lpAppName, TCHAR lpString, string lpFileName);
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool WritePrivateProfileString(TCHAR lpAppName, TCHAR lpKeyName, TCHAR lpString, string lpFileName);
    [DllImport("kernel32.dll")]
    public static extern int GetLastError();
}

封装读写方法

为了方便使用,可以封装一些方法来实现对INI文件的读写操作。

public class IniFile
{
    // 其他代码...
    // 读取INI文件中的所有节名
    public static string[] GetAllSections(string filePath)
    {
        TCHAR lpReturnedString = new TCHAR();
        if (GetPrivateProfileSectionNames(new TCHAR(), lpReturnedString, MAX_PATH, filePath))
        {
            return lpReturnedString.Value.Split(new string[] { "
0