在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.");
}
}
}
注意事项:
-
字符集:
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
。