feat(config): 添加自定义读取和保存方法支持

- 引入 ConfigReader 和 ConfigWriter 委托类型定义
- 在 Config 构造函数中添加自定义读取和保存方法参数
- 实现 ReadConfigFile 和 WriteConfigFile 辅助方法
- 修改文件操作使用自定义方法或默认方法
- 更新测试程序添加多种自定义方法使用示例
- 在文档中添加自定义方法使用的代码示例
This commit is contained in:
2026-01-18 21:36:24 +08:00
parent 7cea589294
commit f146150faa
3 changed files with 161 additions and 17 deletions

View File

@@ -5,21 +5,25 @@ namespace JackCraft.Config;
public class Config
{
public delegate string ConfigReader(string filePath);
public delegate void ConfigWriter(string filePath, string content);
private readonly FileInfo _configFile;
public readonly string ConfigFileName;
public readonly string ConfigFilePath;
private readonly ConfigReader? _customReader;
private readonly ConfigWriter? _customWriter;
private Dictionary<string, object> _configData = new();
public Config(FileInfo configFile)
public Config(FileInfo configFile, ConfigReader? customReader = null, ConfigWriter? customWriter = null)
{
_configFile = configFile;
ConfigFilePath = configFile.DirectoryName ?? string.Empty;
ConfigFileName = configFile.Name;
_customReader = customReader;
_customWriter = customWriter;
if (!configFile.Exists)
{
configFile.Directory?.Create();
using var stream = configFile.Create();
File.WriteAllText(configFile.FullName, "{}");
WriteConfigFile(configFile.FullName, "{}");
}
LoadConfigData();
@@ -29,7 +33,7 @@ public class Config
{
if (File.Exists(_configFile.FullName))
{
var existingJson = File.ReadAllText(_configFile.FullName);
var existingJson = ReadConfigFile(_configFile.FullName);
_configData = JsonConvert.DeserializeObject<Dictionary<string, object>>(existingJson) ??
new Dictionary<string, object>();
}
@@ -39,6 +43,21 @@ public class Config
}
}
// 读取配置文件的辅助方法,使用自定义读取器或默认方法
private string ReadConfigFile(string filePath)
{
return _customReader != null ? _customReader(filePath) : File.ReadAllText(filePath);
}
// 写入配置文件的辅助方法,使用自定义写入器或默认方法
private void WriteConfigFile(string filePath, string content)
{
if (_customWriter != null)
_customWriter(filePath, content);
else
File.WriteAllText(filePath, content);
}
public T? Get<T>(string key)
{
return Get<T>(key, default);
@@ -104,7 +123,7 @@ public class Config
currentData[finalKey] = value!;
var json = JsonConvert.SerializeObject(_configData, Formatting.Indented);
File.WriteAllText(_configFile.FullName, json);
WriteConfigFile(_configFile.FullName, json);
}
public void Delete(string key)
@@ -130,6 +149,6 @@ public class Config
currentData.Remove(finalKey);
var json = JsonConvert.SerializeObject(_configData, Formatting.Indented);
File.WriteAllText(_configFile.FullName, json);
WriteConfigFile(_configFile.FullName, json);
}
}

View File

@@ -13,6 +13,39 @@
var config = new Config(new FileInfo("./config.json"));
```
```csharp
// 定义自定义读取方法
Config.ConfigReader customReader = (filePath) => {
Console.WriteLine($"正在读取文件: {filePath}");
if (File.Exists(filePath))
{
var content = File.ReadAllText(filePath);
Console.WriteLine($"文件内容: {content}");
return content;
}
return "{}";
};
// 定义自定义保存方法
Config.ConfigWriter customWriter = (filePath, content) => {
Console.WriteLine($"正在保存到文件: {filePath}");
// 创建备份
if (File.Exists(filePath))
{
var backupPath = filePath + ".backup";
File.Copy(filePath, backupPath, true);
Console.WriteLine($"已创建备份: {backupPath}");
}
File.WriteAllText(filePath, content);
Console.WriteLine("文件保存完成");
};
// 使用自定义方法创建 Config 实例
var config = new Config(new FileInfo("./config.json"), customReader, customWriter);
```
### 读取键值
> 若键不存在则返回默认值,并且同时也会写入键值(若没有提供默认值则写入空)

View File

@@ -1,4 +1,5 @@
using JackCraft.Config;
using System.Text;
using JackCraft.Config;
namespace Test;
@@ -12,13 +13,104 @@ internal static class Program
Test = "test",
Abc = 123
};
var config = new Config(new FileInfo("./config.json"));
var a = config.Get("aaa.www.www", "555");
var b = config.Get("aaa.bbb", "1");
var c = config.Get("aaa.sss", "1");
var d = config.Get("bbb.sss", "1");
config.Delete("aaa.www");
// 示例1使用默认的文件读取和保存方法
Console.WriteLine("\n=== 使用默认方法 ===");
var config1 = new Config(new FileInfo("./config1.json"));
config1.Set("app.name", "MyApp");
config1.Set("app.version", "1.0.0");
Console.WriteLine($"App Name: {config1.Get<string>("app.name")}");
Console.WriteLine($"App Version: {config1.Get<string>("app.version")}");
// 示例2使用自定义的读取和保存方法
Console.WriteLine("\n=== 使用自定义方法 ===");
// 自定义读取方法 - 添加日志
Config.ConfigReader customReader = filePath =>
{
Console.WriteLine($"[自定义读取] 正在读取文件: {filePath}");
if (File.Exists(filePath))
{
var content = File.ReadAllText(filePath);
Console.WriteLine($"[自定义读取] 文件内容: {content}");
return content;
}
Console.WriteLine("[自定义读取] 文件不存在,返回空字符串");
return "{}";
};
// 自定义保存方法 - 添加日志和备份
Config.ConfigWriter customWriter = (filePath, content) =>
{
Console.WriteLine($"[自定义保存] 正在保存到文件: {filePath}");
Console.WriteLine($"[自定义保存] 文件内容: {content}");
// 创建备份
if (File.Exists(filePath))
{
var backupPath = filePath + ".backup";
File.Copy(filePath, backupPath, true);
Console.WriteLine($"[自定义保存] 已创建备份: {backupPath}");
}
File.WriteAllText(filePath, content);
Console.WriteLine("[自定义保存] 文件保存完成");
};
var config2 = new Config(new FileInfo("./config2.json"), customReader, customWriter);
config2.Set("app.name", "MyCustomApp");
config2.Set("app.version", "2.0.0");
config2.Set("app.author", "Jack");
Console.WriteLine($"App Name: {config2.Get<string>("app.name")}");
Console.WriteLine($"App Version: {config2.Get<string>("app.version")}");
Console.WriteLine($"App Author: {config2.Get<string>("app.author")}");
// 示例3使用加密的自定义读取和保存方法
Console.WriteLine("\n=== 使用加密的自定义方法 ===");
// 简单的Base64编码/解码作为加密示例
Config.ConfigReader encryptedReader = filePath =>
{
Console.WriteLine($"[加密读取] 正在读取加密文件: {filePath}");
if (File.Exists(filePath))
{
var encryptedContent = File.ReadAllText(filePath);
try
{
var decodedBytes = Convert.FromBase64String(encryptedContent);
var decodedContent = Encoding.UTF8.GetString(decodedBytes);
Console.WriteLine("[加密读取] 解密成功");
return decodedContent;
}
catch
{
Console.WriteLine("[加密读取] 解密失败,返回空配置");
return "{}";
}
}
return "{}";
};
Config.ConfigWriter encryptedWriter = (filePath, content) =>
{
Console.WriteLine($"[加密保存] 正在加密保存到文件: {filePath}");
var contentBytes = Encoding.UTF8.GetBytes(content);
var encryptedContent = Convert.ToBase64String(contentBytes);
File.WriteAllText(filePath, encryptedContent);
Console.WriteLine("[加密保存] 加密保存完成");
};
var config3 = new Config(new FileInfo("./config3.encrypted"), encryptedReader, encryptedWriter);
config3.Set("secret.apiKey", "12345-ABCDE");
config3.Set("secret.password", "mySecretPassword");
Console.WriteLine($"API Key: {config3.Get<string>("secret.apiKey")}");
Console.WriteLine($"Password: {config3.Get<string>("secret.password")}");
Console.WriteLine("\n所有示例执行完成");
}
}