c#读写ini配置文件示例
发布时间:2023-09-29 16:31:36
其他人写的都是调用非托管kernel32.dll。我也用过 但是感觉兼容性有点不好 有时候会出现编码错误,毕竟一个是以前的系统一个是现在的系统。咱来写一个纯C#的ini格式配置文件读取,其实就是文本文件读写啦。但是我们要做的绝不仅仅是这样 是为了访问操作的方便 更是为了以后的使用。
都知道ini格式的配置文件里各个配置项 其实就是一行一行的文本 key跟value 用等号隔开。
像这样:
grade=5 。
各个配置项又进行分组 同类型的放到一起 称之为section 以中括号([])区分。
像这样:
[contact]
qq=410910748
website=assassinx.cnblogs.com
[score]
math=85
Chinese=90
geographic=60
各个配置项的key在section内不可重复。
在这里我们为了方便 去掉section的概念 ,实际上也用不怎么到。那么这样一来就可以把个个配置项理解成一个dictionary结构,方便我们存取等操作 。至于为什么一定要使用dictionary 因为在测试时我发现存取过程中他不会打乱元素的存放顺序 晕 就这样啊。 我们要做到就是根据key去取value。还有就是需要注意到我们有时候需要在配置文件里写注释怎么办呢?就是以分号(;)开头的行。这个问题我们可以在程序里为他初始化特殊的key+序号的形式 ,写入的时候也同样的进行判断。
这整个过程就是:
程序开始时遍历所有行 如果以分号(;)开头则存储此行不作为配置解释,如果不是 则解释此行 并放到dictionary集合里去。访问时 根据key获取value 就这么简单。注意注释行的处理 还有更改配置存回去行的先后顺序必须保持原样。
好了开工吧:
public class Config
{
public Dictionary<string, string> configData;
string fullFileName;
public Config(string _fileName)
{
configData = new Dictionary<string,string>();
fullFileName = Application.StartupPath + @"\" + _fileName;
bool hasCfgFile =File.Exists(Application.StartupPath + @"\" + _fileName);
if (hasCfgFile == false)
{
StreamWriter writer = new StreamWriter(File.Create(Application.StartupPath + @"\" + _fileName), Encoding.Default);
writer.Close();
}
StreamReader reader = new StreamReader(Application.StartupPath + @"\" + _fileName, Encoding.Default);
string line;
int indx = 0;
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith(";") || string.IsNullOrEmpty(line))
configData.Add(";" + indx++, line);
else
{
string[] key_value = line.Split('=');
if (key_value.Length >= 2)
configData.Add(key_value[0], key_value[1]);
else
configData.Add(";" + indx++, line);
}
}
reader.Close();
}
public string get(string key)
{
if (configData.Count <= 0)
return null;
else if(configData.ContainsKey(key))
return configData[key].ToString();
else
return null;
}
public void set(string key, string value)
{
if (configData.ContainsKey(key))
configData[key] = value;
else
configData.Add(key, value);
}
public void save()
{
StreamWriter writer = new StreamWriter(fullFileName,false,Encoding.Default);
IDictionaryEnumerator enu = configData.GetEnumerator();
while (enu.MoveNext())
{
if (enu.Key.ToString().StartsWith(";"))
writer.WriteLine(enu.Value);
else
writer.WriteLine(enu.Key + "=" + enu.Value);
}
writer.Close();
}
}


猜你喜欢
- 本文实例讲述了Android编程解析XML方法。分享给大家供大家参考,具体如下:XML在各种开发中都广泛应用,Android也不例外。作为承
- 发现问题:问题如图所示,在eclipse中开启tomcat服务器时报错:端口已被占用。这是因为在tomcat开启的状态下,eclipse异常
- 本文实例为大家分享了Android TextView实现跑马灯效果的具体代码,供大家参考,具体内容如下当Layout中只有一个TextVie
- 前言本文给大家分享一个使用Android开发写字板功能Dem、简单操作内存中的图像、对图像进行简单的处理、绘制直线、以达到写字板的效果效果图
- Springboot导入本地jar后 打包依赖无法加入1.本地jar包2.pom文件添加自定义jar包导入<!--自定义jar--&g
- 软件工程由于需要不断迭代开发,因此要对源代码进行版本管理。Android源代码工程(AOSP)也不例外,它采用Git来进行版本管理。AOSP
- 1、任何的高并发,请求总是会有一个顺序的2、java的队列的数据结构是先进先出的取值顺序3、BlockingQueue类(线程安全)(使用方
- 一、什么是 javabean ?在jsp页面中,包含html代码、css代码、java代码、以及业务逻辑处理代码等。javabean的作用就
- 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程。基本原理通用 Mapper 提供了一些通用的方法,这些通用方
- 自定义View一直是横在Android开发者面前的一道坎。一、View和ViewGroup的关系从View和ViewGroup的关系来看,V
- 项目结构项目路径可以自己定义,只要路径映射正确就可以pom.xml <properties> <spring.versio
- 什么是构建生命周期构建生命周期是一组阶段的序列(sequence of phases),这些构建生命周期中的每一个由构建阶段的不同列表定义,
- 前言Java克隆(Clone)是Java语言的特性之一,但在实际中应用比较少见。但有时候用克隆会更方便更有效率。对于克隆(Clone),Ja
- 前言日志处理是每个项目当中一个非常重要的内容。没有了日志,也就失去了对系统的可控性。没有日志,系统出现任何问题,都会没有踪迹可寻,这对一个信
- 问题描述通过FeignClient调用微服务提供的分页对象IPage报错{"message": "Type d
- maven配置项目的jdk版本无效排查最近在配置项目的jdk的时候发现在pom.xml中配置的1.8版本无效,maven更新后就变成了1.7
- 一. 概述在开发后端接口, 通常都会涉及检验参数必填校验, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的
- 在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem
- 关键词IDEA 如何控制编辑左侧的功能图标 ICONIDEA 左侧的图标不见了怎么恢复1、操作步骤依次打开 File | Settings
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如