C# ini文件与App.config文件的读写

日之朝矣

ini文件读写

读写INI文件

在C#中,读写INI文件通常会使用Windows API中的kernel32.dll中的函数。这些函数包括GetPrivateProfileStringWritePrivateProfileString等。通过P/Invoke调用这些函数,可以方便地读写INI文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Runtime.InteropServices;
using System.Text;

public static class INIFileHelper
{
private static string filePath = "INI文件路径";

#region 导入动态链接库中的方法
/// <summary>
/// 从ini文件中的节和键读取值
/// </summary>
/// <param name="section">ini文件中的节</param>
/// <param name="key">节中的键</param>
/// <param name="defaultValue">如果找不到该键,返回的默认值</param>
/// <param name="returnValue">接收值的<see cref="StringBuilder"/>对象</param>
/// <param name="size"><paramref name="returnValue"/>指向的缓冲区的大小</param>
/// <param name="filePath">ini文件的路径</param>
/// <returns>复制到缓冲区的字符数,不包括结尾的终止符</returns>
[DllImport("kernel32.dll")]
private static extern int GetPrivateProfileString(
string section,
string key,
string defaultValue,
StringBuilder returnValue,
int size,
string filePath);

/// <summary>
/// 将值写入INI文件中的指定节和键。
/// </summary>
/// <param name="section">ini文件中的节</param>
/// <param name="key">要设置值的节中的键</param>
/// <param name="value">要写入键的值</param>
/// <param name="filePath">ini文件的路径</param>
/// <returns></returns>
[DllImport("kernel32.dll")]
private static extern long WritePrivateProfileString(
string section,
string key,
string value,
string filePath);
#endregion

/// <summary>
/// 读取INI文件中的值
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns><see cref="string"/>类型的值</returns>
public static string ReadINIFile(string section, string key)
{
StringBuilder sb = new StringBuilder(1024);
GetPrivateProfileString(section, key, "", sb, 1024, filePath);
return sb.ToString();
}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="value"></param>
public static void WriteINIFile(string section, string key, string value)
{
WritePrivateProfileString(section, key, value, filePath);
}
}

概念解释

INI文件

INI文件是一种用于配置文件的简单、常用格式,是Initialization File的缩写。

INI文件结构: INI文件通常包含节(sections)和键值对(key-value pairs)。

  1. 节(sections): 部分用于对配置进行逻辑分组。部分的名称放在方括号中。一个INI文件可以包含多个部分。

    1
    [SectionName]
  2. 键值对(key-value pairs): 每个部分包含一个或多个键值对,键和值之间用等号(=)分隔。键和值都是字符串。

    1
    KeyName=Value

下面是一个简单的INI文件示例:

1
2
3
4
5
6
[General]
AppName=MyApp
Version=1.0.0

[Settings]
EnableFeatureX=True

动态链接库

动态链接库(Dynamic Link Library,DLL)是一种包含可以被多个程序同时使用的代码和数据的文件。DLL 文件允许程序模块化,这意味着功能可以被分割到独立的 DLL 文件中。通过这种方式,不同的程序可以共享同一个 DLL 文件中的代码和资源,而无需重复代码。

.dll为后缀名的文件通常是动态链接库,也可能是.NET程序集、插件、驱动程序或资源文件。

P/Invoke

P/Invoke(Platform Invocation Services)是.NET中的一个功能,允许托管代码(如C#)调用非托管代码(如Windows API函数、C/C++库函数)。通过P/Invoke,可以在C#程序中使用操作系统提供的功能或其他非托管库中的功能。

托管代码:由CLR管理的代码,如C#、VB.NET代码。

非托管代码:不由CLR管理的代码,如C/C++编写的库函数。

P/Invoke:一种机制,允许托管代码调用非托管代码。

要使用P/Invoke调用非托管函数,需要使用[DllImport]属性,该属性在System.Runtime.InteropServices命名空间中定义。通过该属性,可以指定要调用的非托管DLL及其函数。

App.config文件读写

下面代码仅对appSettingconnectionStrings两个元素进行了增删改查封装,如果需要其他,可参照封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System.Configuration;

public static class AppConfigHelper
{
// ConfigurationUserLevel.None: 获取应用于所有用户的Configuration
static Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
public static void AddOrUpdateAppSetting(string key, string value)
{
var settings = config.AppSettings.Settings;
if (settings[key] == null)
{
settings.Add(key, value);
}
else
{
settings[key].Value = value;
}
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}
public static void RemoveAppSetting(string key)
{
var settings = config.AppSettings.Settings;
if (settings[key] != null)
{
settings.Remove(key);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
}
}
public static void Modify(string key, string value)
{
config.AppSettings.Settings[key].Value = value;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
public static string GetAppSetting(string key)
{
var settings = config.AppSettings.Settings;
return settings[key]?.Value;
}

public static void AddOrUpdateConnectionString(string name, string connectionsString, string providerName = "")
{
var connectionStrings = config.ConnectionStrings.ConnectionStrings;
if (connectionStrings[name] == null)
{
var connStrSetting = new ConnectionStringSettings(name, connectionsString, providerName);
connectionStrings.Add(connStrSetting);
}
else
{
connectionStrings[name].ConnectionString = connectionsString;
connectionStrings[name].ProviderName = providerName;
}
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);
}
public static void RemoveConnectionString(string name)
{
var connectionStrings = config.ConnectionStrings.ConnectionStrings;
if (connectionStrings[name] != null)
{
connectionStrings.Remove(name);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);
}
}

public static string GetConnectionString(string name)
{
var connectionStrings = config.ConnectionStrings.ConnectionStrings;
return connectionStrings[name]?.ConnectionString;
}
}

参考内容

参考内容

Microsoft Learn System.Configuration.ConfigurationManager

ChatGPT

  • 标题: C# ini文件与App.config文件的读写
  • 作者: 日之朝矣
  • 创建于 : 2024-08-07 22:24:58
  • 更新于 : 2024-08-18 09:25:27
  • 链接: https://blog.rzzy.fun/2024/08/07/csharp-ini-and-app-config-read-and-write/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论