【IT168技术文档】
大家在开发过程中或多或少的会使用一些置配文件来存储一些应用程序的配置信息。虽然.net WinForm下有了App.Config,WebForm下有了Web.Config,但很多时候我们都会创建自己的配置文件,用来存储连接字符串或者存储其他信息。
好了,切入正题!如果你只使用.net提供的配置文件存储信息,下面内容唯一的作用就是浪费您的时间和伤害你的眼睛. 关于怎样使用配置文件不是本文的主要内容。我假设大家使用了自己的配置文件,因为配置文件中的内容变动不太频繁,为了提高效率,在程序运行期间,一般只会从配置文件中读取一次信息,然后将其存储在缓存或者一个单实体类中。如此当然是方便高效。如果程序是一个运行时间不长的工具软件,这一切都是美好的,不会出任何问题。但如果程序是一个执行时间很长或者干脆就是一个后台程序,或者是某台服务器上的Web程序。那痛苦就开始了。由于配置信息只会获取一次,当你的配置信息发生变化时,程序中使用的配置信息还是之前的版本,你不得不手动重启程序来反应最新的变化。如果的程序在异地的一个服务器上,那就只有吐血的份了。
解决办法有N种, 下面,就是我采用的解决办法:
使用 FileSystemWatcher!!!
在我的的"自动更新程序"中已经使用了一个Config.xml 存储远端服务器的一个URL,每隔20秒钟,自动更新程序连接到配置文件中记录的URL上获取更新文件。如果每次扫描远程服务器时都读一次配置文件,将会没有必要地浪费性能。 我用一个Config类来获取配置信息。 Config类是一个单实例类,在程序运行期间,他只有一个实例,并且一直存在。在第一次使用他时,创建一个实例,并且将配置信息保存到对像里。以后,只从这个对像中获取信息而不去读取配置文件。下面是一个Config类的简化版:
using System; using System.IO; using System.Xml; namespace Unicom.Utility { /**//// <summary> /// Config 的摘要说明。 /// </summary> public class Config { //配置文件所在的路径 private const string FILE_PATH=@"\Data\config.xml"; public static Config _Instance=null; //一个Config对像 public static Config Instance { get { //第一次使用,如果没有实例,创建一个 if(_Instance==null) { _Instance=new Config(); } return _Instance; } } private string _URL=string.Empty; //存储URL信息. public string URL { get { return _URL; } } private FileSystemWatcher fileWatcher=null; //读取配置信息 private string GetInfoFromFile() { //开始读取配置文件,如果指ConfigFilePath指定的是一个相对路径,则取当前应用程序下的相应路径, //如果是绝对路径,采用绝对路径 XmlTextReader myXml=new XmlTextReader(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,FILE_PATH)); try { return myXml.ReadElementString("URL"); } catch(Exception ex) { throw ex; } finally { myXml.Close(); } } private Config() { _URL=GetInfoFromFile(); //读取并保存xml文件中的配置信息 string FullPath=Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,FILE_PATH); //监视指定的配置文件 fileWatcher=new FileSystemWatcher(Path.GetDirectoryName(FullPath),Path.GetFileName(FullPath)); fileWatcher.Changed+=new FileSystemEventHandler(OnChange); fileWatcher.NotifyFilter=NotifyFilters.LastWrite; //监视最后写入时间 fileWatcher.EnableRaisingEvents=true;//允许触发事件 } //配置文件变化时,重新读取配置信息 private void OnChange() { _URL=GetInfoFromFile(); } } }