记录一下常见配置文件使用方法,先留一份记录,后期不断完善。
一、System.ini
1.INI文件助手类
public class IniFileHelper : CustomIniFile
{
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern uint GetPrivateProfileString(
string lpAppName, // points to section name
string lpKeyName, // points to key name
string lpDefault, // points to default string
byte[] lpReturnedString, // points to destination buffer
uint nSize, // size of destination buffer
string lpFileName // points to initialization filename
);
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
int nSize,
string lpFileName
);
[DllImport("kernel32", CharSet = CharSet.Unicode)]
private static extern bool WritePrivateProfileString(
string lpAppName, // pointer to section name
string lpKeyName, // pointer to key name
string lpString, // pointer to string to add
string lpFileName // pointer to initialization filename
);
/// <summary>
/// 构造IniFile实例。
/// <param name="AFileName">指定文件名</param>
/// </summary>
public IniFileHelper(string AFileName)
: base(AFileName)
{
}
/// <summary>
/// 析够IniFile实例。
/// </summary>
~IniFileHelper()
{
UpdateFile();
}
/// <summary>
/// 读取字符串值。
/// <param name="Ident">指定变量标识。</param>
/// <param name="Section">指定所在区域。</param>
/// <param name="Default">指定默认值。</param>
/// <returns>返回读取的字符串。如果读取失败则返回该值。</returns>
/// </summary>
public override string ReadString(string Section, string Ident, string Default)
{
//byte[] vBuffer = new byte[2048];
//uint vCount = GetPrivateProfileString(Section,
// Ident, Default, vBuffer, (uint)vBuffer.Length, FileName);
return Encoding.Default.GetString(vBuffer, 0, (int)vCount);
//return Encoding.UTF8.GetString(vBuffer, 0, (int)vCount);
var vRetSb = new StringBuilder(2048);
GetPrivateProfileString(Section, Ident, Default, vRetSb, 2048, FileName);
return vRetSb.ToString();
}
/// <summary>
/// 写入字符串值。
/// </summary>
/// <param name="Section">指定所在区域。</param>
/// <param name="Ident">指定变量标识。</param>
/// <param name="Value">所要写入的变量值。</param>
/// <returns>返回写入是否成功。</returns>
public override bool WriteString(string Section, string Ident, string Value)
{
return WritePrivateProfileString(Section, Ident, Value, FileName);
}
/// <summary>
/// 获得区域的完整文本。(变量名=值格式)。
/// </summary>
/// <param name="Section">指定区域标识。</param>
/// <param name="Strings">输出处理结果。</param>
/// <returns>返回读取是否成功。</returns>
public override bool ReadSectionValues(string Section, List<string> Strings)
{
List<string> vIdentList = new List<string>();
if (!ReadSection(Section, vIdentList)) return false;
foreach (string vIdent in vIdentList)
Strings.Add(string.Format("{0}={1}", vIdent, ReadString(Section, vIdent, "")));
return true;
}
/// <summary>
/// 读取区域变量名列表。
/// </summary>
/// <param name="Section">指定区域名。</param>
/// <param name="Strings">指定输出列表。</param>
/// <returns>返回获取是否成功。</returns>
public override bool ReadSection(string Section, List<string> Strings)
{
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(Section, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
{
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}
/// <summary>
/// 读取区域名列表。
/// </summary>
/// <param name="Strings">指定输出列表。</param>
/// <returns></returns>
public override bool ReadSections(List<string> Strings)
{
byte[] vBuffer = new byte[16384];
uint vLength = GetPrivateProfileString(null, null, null, vBuffer,
(uint)vBuffer.Length, FileName);
int j = 0;
for (int i = 0; i < vLength; i++)
if (vBuffer[i] == 0)
{
Strings.Add(Encoding.Default.GetString(vBuffer, j, i - j));
j = i + 1;
}
return true;
}
/// <summary>
/// 删除指定区域。
/// </summary>
/// <param name="Section">指定区域名。</param>
/// <returns>返回删除是否成功。</returns>
public override bool EraseSection(string Section)
{
return WritePrivateProfileString(Section, null, null, FileName);
}
/// <summary>
/// 删除指定变量。
/// </summary>
/// <param name="Section">变量所在区域。</param>
/// <param name="Ident">变量标识。</param>
/// <returns>返回删除是否成功。</returns>
public override bool DeleteKey(string Section, string Ident)
{
return WritePrivateProfileString(Section, Ident, null, FileName);
}
/// <summary>
/// 更新文件。
/// </summary>
/// <returns>返回更新是否成功。</returns>
public override bool UpdateFile()
{
return WritePrivateProfileString(null, null, null, FileName);
}
}
2.抽象类
public abstract class CustomIniFile
{
public CustomIniFile(string AFileName)
{
FFileName = AFileName;
}
private string FFileName;
public string FileName
{
get { return FFileName; }
}
public virtual bool SectionExists(string Section)
{
List<string> vStrings = new List<string>();
ReadSections(vStrings);
return vStrings.Contains(Section);
}
public virtual bool ValueExists(string Section, string Ident)
{
List<string> vStrings = new List<string>();
ReadSection(Section, vStrings);
return vStrings.Contains(Ident);
}
public abstract string ReadString(string Section, string Ident, string Default);
public abstract bool WriteString(string Section, string Ident, string Value);
public abstract bool ReadSectionValues(string Section, List<string> Strings);
public abstract bool ReadSection(string Section, List<string> Strings);
public abstract bool ReadSections(List<string> Strings);
public abstract bool EraseSection(string Section);
public abstract bool DeleteKey(string Section, string Ident);
public abstract bool UpdateFile();
}
3.INI文件管理类
public class IniManager
{
public IniManager()
{
LoadProfile();
}
public static IniFileHelper _file;
public static string SetPlcAction { get; set; } = "";
public static string Handle { get; set; } = "";
public static string ClearCache { get; set; } = "";
public static string SetLineStatus { get; set; } = "";
public static string ReLineStatus { get; set; } = "";
/// <summary>
/// 获取INI文件
/// </summary>
public void LoadProfile()
{
string strPath = AppDomain.CurrentDomain.BaseDirectory;
_file = new IniFileHelper(strPath + "System.ini");
SetPlcAction = _file.ReadString("IPConfig", "SetPlcAction", "");
Handle = _file.ReadString("IPConfig", "Handle", "");
ClearCache = _file.ReadString("IPConfig", "ClearCache", "");
SetLineStatus = _file.ReadString("IPConfig", "SetLineStatus", "");
ReLineStatus = _file.ReadString("IPConfig", "ReLineStatus", "");
}
/// <summary>
/// 保存INI文件
/// </summary>
public static void SaveProfile(string value)
{
string strPath = AppDomain.CurrentDomain.BaseDirectory;
_file = new IniFileHelper(strPath + "System.ini");
_file.WriteString("Config", "ZKPlc", value);
}
}
4.创建一个'Singleton'服务
services.AddSingleton<IniManager>();
5.依赖注入
public MonitoringController(WebRequestHelper _webRequestHelper,IniManager iniManager)
{
webRequestHelper = _webRequestHelper;
}
var addr = IniManager.SetPlcAction;
二、App.config
1.安装Microsoft.Extensions.Configuration
2.添加配置文件(注:使用默认命名无需重新配置映射,修改默认命名看步骤5)
3.配置文件中添加键值对
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="1" value="xxx"/>
<add key="2" value="xxx"/>
<add key="3" value="xxx"/>
</appSettings>
</configuration>
4.读取配置文件
using System.Configuration;
var value=ConfigurationManager.AppSettings["3"];
5.配置文件映射
string configFile = "D:\\StudyWPF\\bin\\Debug\\net6.0-windows\\App1.config";
// Map the new configuration file.
ExeConfigurationFileMap configFileMap =new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = configFile;
var config =ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
var settings = config.AppSettings;
var value = settings.Settings["3"].Value;