在C#中,可以利用Windows API来实现对INI文件的读写操作,以下是具体的实现方法:
需要引入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; } }
使用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[] { "