C# 配置文件使用总结(System.ini,App.config)

记录一下常见配置文件使用方法,先留一份记录,后期不断完善。 

一、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;

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值