C# 基于ConfigurationBuilder编写INI文件写入扩展方法
Microsoft.Extensions.Configuration配套的INI配置提供程序仅实现了读取解析逻辑,没有提供原生的INI写入能力,这个功能不需要引入第三方库,自己按INI基础格式实现即可,和你现有的读取方法完全兼容。
因为你明确说明暂时不需要处理section(节)逻辑,而你现有读取方法返回的扁平化键值对本身就没有节前缀,直接按照key=value的逐行格式写入文件即可,和IniConfigurationProvider的解析规则完全匹配:
- 每行第一个
=作为键和值的分隔符,值中包含的=不会被误解析 - 值为
null或空时,直接写key=即可,读取时会对应拿到空值 - 常规文本不需要额外转义,仅当值中包含换行等特殊字符时才需要补充转义逻辑,绝大多数简单INI场景不需要处理
实现代码
直接在你现有的ExtensionMethods静态类中添加以下方法即可:
using System.Text; public static bool WriteIni(this ConfigurationBuilder _, string filename, ImmutableDictionary<string, string?> map) { try { // 自动创建文件所在目录,避免路径不存在报错 var fileDir = Path.GetDirectoryName(filename); if (!string.IsNullOrEmpty(fileDir) && !Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } // 以UTF8编码全量覆盖写入文件,和.NET INI读取默认编码对齐 using var writer = new StreamWriter(filename, false, Encoding.UTF8); foreach (var (key, value) in map) { // 跳过空键,避免写入无效行 if (string.IsNullOrWhiteSpace(key)) continue; writer.WriteLine($"{key}={value}"); } writer.Flush(); return true; } catch { // 可按需补充异常日志逻辑,和你现有读取方法的错误处理风格对齐即可 return false; } }
补充说明
- 该实现写入的INI文件可以直接被你之前编写的
ParseIni方法正常读取,读写逻辑完全匹配 - 如果后续需要支持section,只需要在写入前把键按
:(.NET Configuration的默认层级分隔符)拆分,遇到新节名时先写入[节名]行,再写入对应节下的键值对即可 - 该实现是全量覆盖写入逻辑,不会保留原有INI文件的注释、空行格式,如果需要做增量修改保留原有格式,需要额外实现INI结构解析逻辑,简单配置存储场景下当前实现完全够用
内容的提问来源于stack exchange,提问作者kofifus
相关产品推荐
相关产品推荐

