博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的配置文件读取类
阅读量:5040 次
发布时间:2019-06-12

本文共 4730 字,大约阅读时间需要 15 分钟。

做了个Windows服务使用app.config来保存是否开启调试输出内容(写记录到数据库),结果发现除非重新启动Windows服务,不然app.config中的更改是不会被读取的。

于是就自己整了个,里面加入了文件监视,这样在你更改文件内容时,可以马上读到配置更改后的内容,调试Windows服务时挺方便的,更值得一提的是.net的文件监视可以监视不存在的文件,这样你就可以随意建立或删除被监视文件

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel;using System.Web;using System.Web.Caching;using System.Reflection;using System.IO;namespace F.Studio.Common.Cfg{    public class SimpleCfgMgr    {        private static readonly SimpleCfgMgr _Instance = new SimpleCfgMgr();        ///         /// 需要提供默认配置文件SConfig.txt        ///         /// 
/// /// ///
public static T GetV
(string key, T def) { return _Instance.GetCfg
(key, def); } ///
/// 提供配置文件名称,不包括路径 /// 配置文件跟可执行文件需要在同一目录下 /// 内容是 /// key=value 这样一行一个配置 /// ///
public SimpleCfgMgr(string configFilename) { this.ConfigFileanme = configFilename; this.CacheKey = "SimpleCfgMgr_" + Guid.NewGuid().ToString("N"); } ///
/// 使用Sconfig.txt配置文件 /// private SimpleCfgMgr() { } private string ConfigFileanme = "SConfig.txt"; private string _CacheKey = "F.Studio.Common.Cfg.SimpleCfgMgr"; public string CacheKey { get { return _CacheKey; } private set { _CacheKey = value; } } private string FileName { get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ConfigFileanme); } } private List
RawList { get { var rawList = HttpRuntime.Cache[CacheKey] as List
; if (rawList == null) { rawList = ParseContent(); var monitorFilename = FileName; try { var fileCacheDep = new CacheDependency(monitorFilename); System.Web.HttpRuntime.Cache.Add(CacheKey, rawList, fileCacheDep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.High, null); } catch (Exception) { }; //Console.WriteLine("读取文件!"); } return rawList; } } ///
/// 读取器 /// ///
///
///
public T GetCfg
(string key, T defV) { var list = RawList; if (list == null || list.Count == 0) return defV; foreach (var item in RawList) { if (string.Compare(key, item.Key, true) == 0) { return TryParser
(item.Value, defV); } } return defV; } ///
/// 解析器 /// ///
private List
ParseContent() { var txt = LoadTextContent().Trim(); var lines = txt.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); List
list = new List
(); foreach (string line in lines) { if (string.IsNullOrWhiteSpace(line) || string.IsNullOrEmpty(line)) continue; var str = line.Trim(); //忽略注释 if (str.StartsWith("/") || str.StartsWith("-") || str.StartsWith("*") || str.StartsWith("#")) continue; var index = str.IndexOf("="); if (index > 0 && str.Length > index + 1) //等号前后至少有一个非空字符 { var key = str.Substring(0, index); var value = str.Substring(index + 1, str.Length - index - 1); list.Add(new CfgRawItem(key.Trim(), value.Trim())); } } return list; } ///
/// 加载器 /// ///
private string LoadTextContent() { if (!File.Exists(FileName)) { return string.Empty; } try { var content = File.ReadAllText(FileName); return content; } catch (Exception) { return string.Empty; } } ~SimpleCfgMgr() { HttpRuntime.Cache.Remove(CacheKey); } #region HelpMethod protected static T TryParser
(object v, T dValue) { if (v == null) { return dValue; } else { T t = default(T); try { if (t == null)//可空类型 { Type type = typeof(T); TypeConverter conv = TypeDescriptor.GetConverter(type); t = (T)conv.ConvertFrom(v); } else { t = (T)Convert.ChangeType(v, typeof(T)); } } catch { t = dValue; } return t; } } #endregion } #region Model public class CfgRawItem { public CfgRawItem(string key, string value) { this.Key = key; this.Value = value; } public string Key { get; set; } public string Value { get; set; } } #endregion}
View Code

 

转载于:https://www.cnblogs.com/wdfrog/archive/2013/03/18/2965422.html

你可能感兴趣的文章
【转】TCP/IP协议栈及OSI参考模型详解
查看>>
在ASP.NET中操作EXCEL文件
查看>>
BP神经网络的直观推导与Java实现
查看>>
python学习之路,基础知识-列表(list)
查看>>
动态加载多国语言 ---- cookie + 浏览器
查看>>
@Controller和@RestController的区别?
查看>>
《Java大学教程》—第9章 软件质量
查看>>
Andriod-项目stymqjlb-学习笔记1-开始
查看>>
Zookeeper系列(二)特征及应用场景
查看>>
【HTTP】Fiddler(三)- Fiddler命令行和HTTP断点调试
查看>>
Spring Boot使用Druid和监控配置
查看>>
poi 处理空单元格
查看>>
Android 内存泄漏优化总结
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>