Vs2005之简单日志工具的制作--3.系统配置

  系统配置可以分为好多种,ini的,注册表或者其他的。在TSysConfig中,引用了两个类:TSysIni和TSysReg。前者提供系统的ini配置服务,后者提供系统的注册表配置服务。

  

private TSysIni FSysIni;
private TSysReg FSysReg;
 

  下面行说Ini服务TSysIni。
  这个类需要完成的功能比较简单,它要提供一些系统配置的存取操作。一般来说,写入ini是这样进行的:WriteString(string big,string small,string value),当然,在写入之前,还需要连接ini文件---那么,是否可以让连接ini文件的工作由TSysIni来做,而实际的ini操作功能由其他类来实现呢?答案当然是可以的,请看TSysIni 的构造函数:

  

public class TSysIni : ieIni.ieIni
    ...{

        /**//// <summary>
        /// 在执行完ieIni的构造函数后,给FileName赋值,并连接到ini文件
        /// 由于此类用于系统ini配置,因此FileName在构造函数中就被赋值
        /// </summary>
        public TSysIni()
        ...{
            this.FileName = Application.StartupPath + @"SysConfig.ini";
            this.Active = true;
        }
    }

 

  这里,命名空间ieIni中的类ieIni是我自定义的一个控件,它提供了对ini的读写操作。这样,类TSysIni就只是与SysConfig.ini这个系统配置文件相关。然后,在类TSysConfig中可以以属性的方式将TSysIni的对象公布出来,也可以不用公布TSysIni对象而仅提供一些常用的系统ini配置操作,我用了后面的一种方法:

  

public void SetIniString(string name, string Value)
    ...{
        FSysIni.SetString("SystemConfig", name, Value);
    }
  public string GetIniString(string name, string Default)
    ...{
        return FSysIni.GetString("SystemConfig", name, Default);
    }

 

  其他还有对bool、DateTime、int、double的操作,与对String的操作非常相似。

  可能会问,一个简单的ini操作而已,还需要设计成三个等级的类,也太麻烦了吧!
  这样做,当然有原因:
    对系统配置类TSysConfig来说,它不需要知道这些配置写入了哪个ini文件,如何写入ini文件,它只需知道通过变量FSysIni就可以将配置写入ini文件。
  对类TSysIni,它同样只需知道通过父类ieIni,可以将配置写入SysConfig.ini,至于如何写入由ieIni来关心。
  而类ini提供了最基础的ini读写操作。

    将各个类的功能划分清楚,可以方便地对各项功能进行扩展:
  TSysConfgi还需要系统注册配置服务,好,我们引用类TSysReg,具体如何实现由类TSysReg去关心;
  除了系统配置SysConfig.ini,可能还需要其他的配置文件,比如记录各种窗口的大小、位置等,那么我们像类TSysIni一样,建立一个新类TWindowsInfoIni,它可以提供类似于这样的功能:SetWindowInfo(string windowName,Rectangle rect);
  ieIni中目前提供了string、int、double、bool、datetime等类型数据的操作,同样可以方便地增加其他数据类型的读写操作。而且它可以很方便地移植到其他项目中。(事实上,类ieIni本来就是从其他项目移植过来的。)

    该说ieIni了,毕竟ini操作的主角是它。
  使用vs2005,不得不说有时候是比较郁闷的。举个简单的例子,它居然不像dlephi一样,提供类对ini进行读写操作。虽然说提供api调用的方式,但还是显得比较麻烦。在学习ado.net时,我发现了类DataSet的两个方法:WriteXml和ReadXml。于是我就想,何不利用DataSet来间接地实现ini的操作呢?只要是保存到一个ini文件中,调用的方法类似,实际存储的格式并不不重要。何况,xml也是一种趋势!

  由于考虑到使用的方便,我将ieIni做成了一个控件:
    public partial class ieIni : Component

    首先,它需要下面的这些变量(变量的作用见说明):
 

private DataSet ini = new DataSet("ini");//DataSet对象,通过它间接地实现ini操作
    private Boolean FActive = false;//记录是否与ini文件进行操作
    private Boolean FUP = true;//FUP表示每次写入数据时,是否要即时更新到ini文件, 默认为即时更新
    private string FFileName;//用于保存ini文件名,内部使用

 

   
  要使用它,第一步便是设置ini文件的路径:
  

public String FileName
    ...{
        get
        ...{
            return FFileName;
        }
        set
        ...{
            if (!Active)
            ...{
                FFileName = value;
            }
            else
            ...{
                System.Windows.Forms.MessageBox.Show("已连接到ini文件,无法设置文件名!");
            }
        }
    }

 

  其中Active是与变量FActive相关的一个属性,通过它来获取或设置与ini文件的连接状态:
      

public bool Active
        ...{
            get
            ...{
                return FActive;
            }
            set
            ...{
                if (value)
                ...{
                    if (FActive)
                        return;

                    连接ini文件#region 连接ini文件
                    try
                    ...{
                        ini.ReadXml(FileName);
                        FActive = true;
                    }
                    catch (Exception)
                    ...{
                        FActive = false;
                    }

                    if (!(FActive))
                    ...{
                        try
                        ...{
                            string s = Path.GetDirectoryName(FileName);
                            if (!(Directory.Exists(s)))
                                Directory.CreateDirectory(s);
                            ini.WriteXml(FileName);
                            FActive = true;
                        }
                        catch (Exception ex)
                        ...{
                            System.Windows.Forms.MessageBox.Show(ex.Message);
                            FActive = false;
                        }
                    }
                    #endregion

                }
                else
                ...{
                    FActive = false;
                    try
                    ...{
                        ini.WriteXml(FileName);
                    }
                    catch (Exception)
                    ...{
                    }
                    ini.Clear();
                }
            }
        }
  

 

    在设置Active的值为true时,它会检查是否有这个ini文件,没有则建立。

    属性UP用于获取或设置变量FUP的值:
 

public bool UP
    ...{
        get
        ...{
            return FUP;
        }
        set
        ...{
            FUP = value;
        }
    }

 

  SetString将一个字符串写入到ini文件中:
       

public void SetString(string Big, string Small, string Value)
        ...{
            if (!(FActive)) return;

            DataTable newTable = ini.Tables[Big];
            if (newTable == null)
            ...{
                newTable = new DataTable(Big);
                ini.Tables.Add(newTable);
            }

            DataColumn newColumn = newTable.Columns[Small];
            if (newColumn == null)
            ...{
                newColumn = new DataColumn(Small, typeof(string));
                newTable.Columns.Add(newColumn);
            }

            DataRow newRow;
            try
            ...{
                newRow = newTable.Rows[0];
            }
            catch (Exception)
            ...{
                newRow = newTable.NewRow();
                newTable.Rows.Add(newRow);
            }

            try
            ...{
                newRow[Small] = Value;
            }
            catch (Exception)
            ...{
            }

            if (UP) ini.WriteXml(FileName);
        }
  

 

        GetString用于读取一个字符串变量:
  

public string GetString(string Big, string Small, string Default)
        ...{
            if (!(FActive)) return Default;

            string s;

            DataTable newTable = ini.Tables[Big];
            if (newTable == null)
            ...{
                s = Default;
                goto OnGetString;
            }

            DataColumn newColumn = newTable.Columns[Small];
            if (newColumn == null)
            ...{
                s = Default;
                goto OnGetString;
            }
            
            try
            ...{
                s = newTable.Rows[0][Small].ToString();
            }
            catch (Exception)
            ...{
                s = Default;
            }
        }
  

 

        这两个函数的实现非常简单,这里不多做解释。(原理是将tableName作为ini中的big项,fieldName作为ini中的small项。)

  对于其他数据类型的读写操作,可以通过与字符串的转换来进行,就像GetInt一样:
  

public int GetInt(string Big, string Small, int Default)
        ...{
            string s = GetString(Big, Small, Convert.ToString(Default));
            try
            ...{
                return Convert.ToInt32(s);
            }
            catch (Exception)
            ...{
                return Default;
            }
        }
  
 

  最后,由于ieIni是作为控件存在,因此它提供了两个事件,OnSetValue和OnGetValue。关于如何为控件添加事件,不在本章的讨论之列,有兴趣可以自选参考源代码。

  由于MyLog3中最后并不需要系统注册表配置服务,所以这里TSysReg我只是定义了一个类的原型,没有任何的实现,留待以后需要的时候再去实现它。

  下一篇,系统文件类型注册。
  ie.2008-04-07

 

时间: 2024-10-02 04:24:19

Vs2005之简单日志工具的制作--3.系统配置的相关文章

Vs2005之简单日志工具的制作--6.启动

下面说说系统的启动. 说到启动,就又想起了.net另一个让人郁闷的地方:winform程序相比其他开发工具(比如delphi)产生的程序,启动速度太慢了.启动一个winform程序,可能过了好久系统才真正进入.在这个过程中,如果能将启动条理化,并反应出来,让人看到什么时候程序在做什么,也是一个不错的办法. 打开MyLog3的解决方案,在MyLog3项目中可以找到一个窗口TfrmConver,它看起来像这个样子:         这个界面希望它能够做两件事情: 一是启动的时候,显示一些启动信息:二

Vs2005之简单日志工具的制作--5.数据结构检查

前面说过,所有的管理信息都以DataSet的形式存入了ml3文件中,那么,我们需要一个类,它能够读取这个ml3文件,并且将读取的结果返回给我们: class TSysData    ...{        private DataSet FDataSet;         public DataSet DataSet        ...{            get            ...{                return FDataSet;            }   

Vs2005之简单日志工具的制作--4.文件类型注册

文件类型注册的可重用的类在项目FileTypeReg里,而实际使用的类TSysRegeist在MyLog3(即主程序)项目中. 所谓文件类型注册,实际上是向注册表的HKEY_CLASSES_ROOT项中写入一些相关的数据:首先,在HKEY_CLASSES_ROOT项下建立一个子项,名称即为后缀名,如".ml3".它有一个默认值,比如"ML3_FileType".意思是指,".ml3"文件类型的相关数据存储在HKEY_CLASSES_ROOT下的&

vs2005自带部署工具制作的安装文件,安装后,用桌面或开始菜单快捷方式起动,总是运行windows installer

问题描述 vs2005自带部署工具制作的安装文件,安装后,用桌面或开始菜单快捷方式起动,总是运行windowsinstaller,如果移动了原始安装文件,就无法正常起动,好像安装后的程序的运行离不开原始安装文件.但如果进入安装后的文件夹,直接运行程序,则没有这个问题.高手帮忙! 解决方案 解决方案二:可能是你的快捷方式位置指定的不正确,你可以在安装项目里找到EXE程序用IDE自动给它生成快捷方式,然后复制到你想放置的安装目录.解决方案三:不会吧,难道没有高手知道???解决方案四:看你的快捷方式指

Photoshop入门实例教程:简单拼贴图的制作方法

本教程介绍简单拼贴图的制作方法.大致过程:处理之前需要用网格及辅助线把素材均分成一些小方块,然后分别用选区把这些小方块复制到新的图层,适当给小方块描边并添加投影.最后把小方法变形处理,再改变背景颜色即可.原图 最终效果 [1] [2] [3]  下一页

阿里云有什么监控CPU和内存的日志工具

监控CPU和内存的日志工具 Linux 工具: 下载地址:get_cpu_mem_info_sh.rar 使用方法: 下载该文件解压后,上传到 /tmp 目录中. 运行 cd 切换到/tmp目录. 执行: nohup bash get_cpu_mem_info.sh & 该工具会在 /tmp 目录下生成一个日志文件,记录实时监控系统的 CPU.内存的使用情况,等到系统异常时可以用于分析日志. Windows 工具: 下载地址:get_cpu_mem_info_bat.rar 使用方法: 下载该文

PS矢量工具快速制作促销海报字体教程

  这篇教程教脚本之家的PS文字效果学习者们使用PS矢量工具快速制作促销海报字体方法,教程制作出来的文字效果挺漂亮的,制作的难度一般,主要是和大家浅谈利用PS矢量工具打造字体的技巧,推荐一下和脚本之家的朋友们一起分享学习了! 教程结束,以上就是PS矢量工具快速制作促销海报字体教程,从这篇教程里,我们可以学习PS矢量工具的运用,希望大家能熟练运用! 分类: PS文字教程

php实现的简单日志写入函数

 本文实例讲述了php实现的简单日志写入函数.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 function log( $logthis ){ file_put_contents('logfile.log', date("Y-m-d H:i:s"). " " . $logthis. "rn", FILE_APPEND | LOCK_EX); } // use rn for new line on windows,

Node.js和MongoDB实现简单日志分析系统

  Node.js和MongoDB实现简单日志分析系统  这篇文章主要介绍了Node.js和MongoDB实现简单日志分析系统,本文给出了服务器端.客户端.图表生成.Shell自动执行等功能的实现代码,需要的朋友可以参考下     在最近的项目中,为了便于分析把项目的日志都存成了JSON格式.之前日志直接存在了文件中,而MongoDB适时闯入了我的视线,于是就把log存进了MongoDB中.log只存起来是没有意义的,最关键的是要从日志中发现业务的趋势.系统的性能漏洞等.之前有一个用Java写的