using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace WQ
{
/// <summary>
/// 初始化文件
/// </summary>
public class iniFile
{
// Windows API 参考手册:http://www.office-cn.net/t/api/index.html?writeprivateprofilestring.htm
// https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-writeprivateprofilestringa
/// <summary>
///
/// </summary>
/// <param name="lpAppName">节的名称。如果节不存在,则会创建一个。</param>
/// <param name="lpKeyName">键的名称。如果指定节中不存在该键,则会创建它。如果此参数为null,则会删除整个节(包括该节中的所有条目)。</param>
/// <param name="lpString">要写入文件的字符串。如果此参数为null,则删除lpKeyName参数指向的键。</param>
/// <param name="lpFileName">初始化文件的名称。</param>
/// <returns>如果函数成功,则返回值为非零。如果函数失败,则返回值为零。</returns>
[DllImport("kernel32.dll")]
private static extern int WritePrivateProfileStringA(string lpAppName, string lpKeyName, string lpString, string lpFileName);
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofilestring
/// <summary>
///
/// </summary>
/// <param name="lpAppName">节的名称。如果此参数为null,则会将文件中所有节的名称复制到提供的缓冲区中。</param>
/// <param name="lpKeyName">键的名称。如果此参数为null,则会将lpAppName中所有键的名称复制到提供的缓冲区中。</param>
/// <param name="lpDefault">默认字符串。如果在初始化文件中找不到lpKeyName,则会将默认字符串复制到提供的缓冲区中。如果此参数为null,则默认为空字符串""。</param>
/// <param name="lpReturnedString">缓冲区。</param>
/// <param name="nSize">缓冲区的大小,以字符为单位。</param>
/// <param name="lpFileName">初始化文件的名称。</param>
/// <returns>返回值是复制到缓冲区的字符数。</returns>
[DllImport("kernel32.dll")]
private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
[DllImport("kernel32.dll")]
private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, byte[] lpReturnedString, int nSize, string lpFileName);
/// <summary>
/// 写。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <param name="section">节</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <returns>true表示写入成功,false表示写入失败。</returns>
public static bool Write(string filePath, string section, string key, string value)
{
int val = WritePrivateProfileStringA(section, key, value, filePath);
if (val != 0)
return true;
else
return false;
}
/// <summary>
/// 删除指定的键。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <param name="section">节</param>
/// <param name="key">键</param>
/// <returns>true表示删除成功,false表示删除失败。</returns>
public static bool DeleteKey(string filePath, string section, string key)
{
int val = WritePrivateProfileStringA(section, key, null, filePath);
if (val != 0)
return true;
else
return false;
}
/// <summary>
/// 删除指定的节。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <param name="section">节</param>
/// <returns>true表示删除成功,false表示删除失败。</returns>
public static bool DeleteSection(string filePath, string section)
{
var val = WritePrivateProfileStringA(section, null, null, filePath);
if (val != 0)
return true;
else
return false;
}
/// <summary>
/// 读值。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <param name="section">节</param>
/// <param name="key">键</param>
/// <returns>值</returns>
public static string ReadValue(string filePath, string section, string key)
{
StringBuilder sb = new StringBuilder(1024);
var charLength = GetPrivateProfileString(section, key, "", sb, sb.Capacity, filePath);
return sb.ToString();
}
/// <summary>
/// 读出指定节中所有的键。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <param name="section">节</param>
/// <returns>指定节中所有的键。</returns>
public static List<string> ReadKey(string filePath, string section)
{
List<string> keys = new List<string>();
byte[] buf = new byte[2000];
var charLength = GetPrivateProfileString(section, null, "", buf, buf.Length, filePath);
int j = 0;
for (int i = 0; i < charLength; i++)
{
if (buf[i] == 0)
{
keys.Add(Encoding.Default.GetString(buf, j, i - j));
j = i + 1;
}
}
return keys;
}
/// <summary>
/// 读出文件中所有的节。
/// </summary>
/// <param name="filePath">ini文件的路径。示例:H:\学习\C#\示例\Demo.ini</param>
/// <returns>文件中所有的节。</returns>
public static List<string> ReadSection(string filePath)
{
List<string> keys = new List<string>();
byte[] buf = new byte[2000];
var charLength = GetPrivateProfileString(null, null, "", buf, buf.Length, filePath);
int j = 0;
for (int i = 0; i < charLength; i++)
{
if (buf[i] == 0)
{
keys.Add(Encoding.Default.GetString(buf, j, i - j));
j = i + 1;
}
}
return keys;
}
}
}
C#操作ini文件(读、写、删)
于 2022-01-08 13:18:35 首次发布