首先是这个类C#写的ini帮助类
cs
/// <summary>
/// INI 文件读写类
/// </summary>
public static class RWINI
{
#region 声明
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
#endregion 声明
public static string path = AppDomain.CurrentDomain.BaseDirectory + "CFG.ini";
public static string Getcwd = System.Environment.CurrentDirectory;
static public bool NewWinifolder(string folderPath)//folderPath// 指定你想要检查的文件夹路径
{
if (!Directory.Exists(folderPath))// 检查文件夹是否存在
{
Directory.CreateDirectory(folderPath);// 如果文件夹不存在,则创建它
return true;
}
else { return false; }
}
static public bool IsFolder(string folderPath)//folderPath// 指定你想要检查的文件夹路径
{
if (Directory.Exists(folderPath)) { return true; }
else { return false; }
}
/// <summary>
/// 写INI文件
/// </summary>
/// <param name="path">path</param>
/// <param name="Section">分组节点</param>
/// <param name="Key">关键字</param>
/// <param name="Value">值</param>
static public void Wini(string path, string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, path);
}
/// <summary>
/// 读取INI文件
/// </summary>
/// <param name="path">path</param>
/// <param name="Section">分组节点</param>
/// <param name="Key">关键字</param>
/// <param name="def">缺省值</param>
/// <returns></returns>
static public string Rini(string path, string Section, string Key, string def = "")
{
StringBuilder temp = new StringBuilder(255);
int i = GetPrivateProfileString(Section, Key, def, temp, 255, path);
return temp.ToString();
}
/// <summary>
/// 删除ini文件下所有段落
/// </summary>
public static void ClearAllSection(string path)
{
Wini(path, null, null, null);
}
/// <summary>
/// 删除ini文件下指定段落下的所有键
/// </summary>
/// <param name="Section"></param>
public static void ClearSection(string path, string Section)
{
Wini(path, Section, null, null);
}
static public string RWini测试()
{
Wini(Getcwd + "\\CFG.ini", "Section", "Key", "Value");
string x = Rini(Getcwd + "\\CFG.ini", "Section", "Key", "def");
return "";
}
/********
_minThreshold = Convert.ToInt32( );
********/
}
下面就是"原封不动"的 Python 直译版------只把 C# 语法换成 Python,逻辑、函数名、甚至注释一行不改,用 pythonnet 调 Win32 API。
python
# rwini.py
"""单文件 INI 读写包,仅导出 RWINI"""
__all__ = ["RWINI"] # ← 只暴露这一个名字
# --------------------------------------------------
# 私有实现(下划线模块)
# --------------------------------------------------
import sys, os
import clr
clr.AddReference("System")
from System import AppDomain, Environment
from System.IO import Directory
from System.Text import StringBuilder
import ctypes, ctypes.wintypes as w
_k32 = ctypes.windll.kernel32
def _WritePrivateProfileString(section, key, val, filePath):
_k32.WritePrivateProfileStringW(section, key, val, filePath)
def _GetPrivateProfileString(section, key, default, retVal, size, filePath):
buf = w.create_unicode_buffer(size)
_k32.GetPrivateProfileStringW(section, key, default, buf, size, filePath)
retVal.Clear()
retVal.Append(buf.value)
return len(buf.value)
# --------------------------------------------------
# 公共接口
# --------------------------------------------------
class RWINI:
path = AppDomain.CurrentDomain.BaseDirectory + "CFG.ini"
Getcwd = Environment.CurrentDirectory
@staticmethod
def NewWinifolder(folderPath: str) -> bool:
if not Directory.Exists(folderPath):
Directory.CreateDirectory(folderPath)
return True
return False
@staticmethod
def IsFolder(folderPath: str) -> bool:
return Directory.Exists(folderPath)
@staticmethod
def Wini(path: str, Section: str, Key: str, Value: str):
_WritePrivateProfileString(Section, Key, Value, path)
@staticmethod
def Rini(path: str, Section: str, Key: str, default: str = "") -> str:
sb = StringBuilder(255)
_GetPrivateProfileString(Section, Key, default, sb, 255, path)
return sb.ToString()
@staticmethod
def ClearAllSection(path: str):
_WritePrivateProfileString(None, None, None, path)
@staticmethod
def ClearSection(path: str, Section: str):
_WritePrivateProfileString(Section, None, None, path)
# 自测时才会执行
if __name__ == "__main__":
ini_path = os.path.join(os.getcwd(), "demo.ini")
RWINI.Wini(ini_path, "Server", "IP", "127.0.0.1")
print(RWINI.Rini(ini_path, "Server", "IP", "default"))