读写ini配置文件,适用于HTA

发布时间:2019-07-20编辑:脚本学堂
读写ini配置文件

读写ini配置文件
ini文件是经常使用到的文件格式,本质上是特定格式的文本文件,用记事本就可以轻松编辑。它用于保存各种程序所需要到的配置参数,格式如下:
[显示]
font=宋体
size=9pt
[用户]
user1=Benny
user2=郑运涛

很简单的文件书写格式,每个
以及下边的参数就是一种配置,本文里的代码就是实现对这样的书写格式的文件进行读写。

首先看看类的代码:

function IniStruct()
{
  this.Name = new String();
  this.Attribute = new Object();
  this.setName = function(Name)
  {
    Name = Name.toString();
    var re = /^[^s]+$/;
    if(!re.test(Name))
    {
      return false;
    }
    else
    {
      this.Name = Name;
      return true;
    }
  }
  this.setAttribute = function(AttributeName,AttributeValue)
  {
    AttributeName = AttributeName.toString();
    AttributeValue = AttributeValue.toString();
    var reforName = /^w+$/i;
    var reforValue = /^[^s]*$/;
    if(!reforName.test(AttributeName) || !reforValue.test(AttributeValue))
    {
      return false;
    }
    else
    {
      this.Attribute[AttributeName] = AttributeValue;
      return true;
    }
  }
  this.getAttribute = function(AttributeName)
  {
    var reforName = /^w+$/i;
    if(!reforName.test(AttributeName))
    {
      return false;
    }
    else
    {
      return this.Attribute[AttributeName];
    }
  }
  this.toString = function()
  {
    var Str = new String();
    Str += "[" + this.Name + "]n";
    for(var p in this.Attribute)
    {
      Str += p + "=" + this.Attribute[p] + "n";
    }
    return Str;
  }
  this.getArr = function()
  {
    var Arr = new Array();
    Arr[0] = "[" + this.Name + "]";
    var i = 1;
    for(var p in this.Attribute)
    {
      Arr[i++] = p + "=" + this.Attribute[p];
    }
    return Arr;
  }
}

function IniCtrl()
{
  this.FilePath = new String();
  this.fso = new ActiveXObject("Scripting.FileSystemObject");
  this.file = null;
  this.IsOpen = false;
  this.IniStruct = null;
  this.Struct = null;
  this.FilePath = null;
  this.Close = function()
  {
    if(this.file != null)
    {
      this.file.Close();
    }
    this.IniStruct = null;
    this.file = null;
     this.FilePath = null;
    this.IsOpen = false;
  }
  this.Open = function(FilePath)
  {
    FilePath = FilePath.toString();
    var Re = /^.+.ini$/i;
    if(!Re.test(FilePath))
    {
      alert("文件名出错,后缀名应该为.ini");
      this.Close();
      return false;
    }
    else
    {
      if(!this.fso.FileExists(FilePath))
      {
        alert("文件不存在");
        this.Close();
        return false;
      }
      else
      {
        this.Close();
        this.file = this.fso.OpenTextFile(FilePath,1,false);
        this.IsOpen = true;
        if(!this.Init())
        {
          return false;
        }
        this.FilePath = FilePath;
        return true;
      }
    }
  }
  this.Create = function(FilePath)
  {
    FilePath = FilePath.toString();
    var Re = /^.+.ini$/i;
    if(!Re.test(FilePath))
    {
      alert("文件名出错,后缀名应该为.ini");
      this.Close();
      return false;
    }
    else
    {
      if(this.fso.FileExists(FilePath))
      {
        alert("文件已经存在");
        this.Close();
        return false;
      }
      else
      {
        try
        {
          this.Close();
          this.file = this.fso.CreateTextFile(FilePath, 2,false);
          this.IsOpen = true;
          this.FilePath = FilePath;
          return true;
        }
        catch(ex)
        {
          alert("无法新建文件,可能磁盘已经满或者文件名格式不正确");        
          this.Close();
          return false;
        }
      }
    }
  }
  this.Init = function()
  {
    if(!this.IsOpen)
    {
      alert("文件还未打开");
      return false;
    }
    else
    {
      var tmpStr = new Array();     
      while(!this.file.AtEndOfStream)
      {
        tmpStr[tmpStr.length] = this.file.ReadLine();
      }
      var tmpStruct = null;
      this.IniStruct = new Array();
      var At = 0;
      var reForSet = /^[([^s]+)]$/i;
      var reForAtt = /^(w+)=(.*)/i;
      var Name = new String();
      var i = 0;
      var AttName = null;
      var AttValue = null;
      while(i < tmpStr.length)
      {
        if(reForSet.test(tmpStr))
        {
          At = this.IniStruct.length;
          this.IniStruct[At] = new IniStruct();
          tmpStruct = this.IniStruct[At];
          Name = tmpStr.replace(reForSet,"$1");
          if(!tmpStruct.setName(Name))
          {
            this.IniStruct.length = At;
            tmpStruct = (At == 0) ? null : this.IniStruct[At - 1];
          }
        }
       
        if(reForAtt.test(tmpStr) && (tmpStruct != null))
        {
          AttName = tmpStr.replace(reForAtt,"$1");
          AttValue = tmpStr.replace(reForAtt,"$2");
          tmpStruct.setAttribute(AttName,AttValue);
        }
        i++;
      }
     
      return true;
    }
  }
  this.select = function(Name)
  {
    if(this.IniStruct == null)
    {
      return false;
    }
    else
    {
      for(var i = 0; i < this.IniStruct.length; i++)
      {
        if(this.IniStruct.Name == Name)
        {
          this.Struct = this.IniStruct;
          return true;
        }
      }
      this.Struct = null;
      return false;
    }
  }
  this.setAttribute = function(AttributeName,AttributeValue)
  {
    if(this.Struct == null)
    {
      return false;
    }
    else
    {
      return this.Struct.setAttribute(AttributeName,AttributeValue);
    }
  }
  this.getAttribute = function(AttributeName)
  {
    if(this.Struct == null)
    {
      return false;
    }
    else
    {
      return this.Struct.getAttribute(AttributeName);
    }
  }
  this.save = function()
  {
    if(!this.IsOpen)
    {
      alert("文件还未打开");
      return false;
    }
    else
    {
      try
      {
        var tmpfso = new ActiveXObject("Scripting.FileSystemObject");
        var tmpName = tmpfso.GetTempName();
        var f = tmpfso.CreateTextFile(tmpName,2,false);
        var FilePath = this.FilePath;
        var Arr = null;
        for(var i = 0; i < this.IniStruct.length; i++)
        {
          Arr = this.IniStruct.getArr();
          for(var t = 0; t < Arr.length; t++)
          {
            f.WriteLine(Arr[t]);
          }
        }
        this.Close();
        tmpfso.DeleteFile(FilePath);
        tmpfso.CopyFile(tmpName,FilePath);
        f.Close();
        tmpfso.DeleteFile(tmpName);
        this.Open(FilePath,1);
        return true;
      }
      catch(ex)
      {
        alert("无法保存");
        return false;
      }
    }
  }
  this.AddSetting = function(SetName)
  {
    if(!this.select(SetName))
    {
      var tmpStruct = new IniStruct();
      if(!tmpStruct.setName(SetName))
      {
        return false;
      }
      else
      {
        if(this.IniStruct == null)
        {
          this.IniStruct = new Array();
        }
        this.IniStruct[this.IniStruct.length] = tmpStruct;
        return true;
      }
    }
  }
}

这里有两个类,一个是IniStruct类,一个是IniCtrl类,它们实现的功能是不同的,一个IniStruct类的实例就是一种配置结构,并且它提供了基本的方法,而IniCtrl类实现对ini文件的读写以及分析。

IniStruct类的参考如下:
属性:

   Name: 配置名称,也包含在[]里边的内容
   Attribute:保存了所有的参数。

方法:
   setName:设置配置名称,参数即为名称。
   setAttribute:设置某参数的值,如果该参数不存在,则动态生成一个。参数为参数名、参数值
   getAttribute:返回某参数的值,如果该参数不存在返回false
   toString:重写了toString方法,返回ini文件中的书写格式的字符串
   getArr:按照ini文件中的书写格式把每一行放在数组里的每个元素并且返回数组,这是IniCtrl类保存文件所需要到的

IniCtrl类的参考如下:
属性:
   FilePath:ini文件的路径
   fso:FileSystemObject对象
   file:通过fso打开的文件对象
   IsOpen:文件是否已经打开
   IniStruct:一个IniStruct类的实例数组,放了从ini文件里读出来的各种配置
   Struct:正在操作的IniStruct类的实例
   Close:关闭文件,在使用完IniCtrl类的实例后,一定要调用它关闭文件。
   Open:打开文件,并且调用Init函数进行初始化
   Create:新建一个ini文件
   Init:初始化ini配置,根据读出来的内容进行分析保存在IniStruct数组中。
   select:选择当前配置,在打开ini文件之后如果想设置某个配置的参数时必须调用这个方法,使Struct属性指向对应的IniStruct实例。
   setAttribute:设置当前配置的属性,调了用IniStruct的setAttribute方法
   getAttribute:返回当前配置某属性的值,调用了IniStruct的getAttribute方法
   save:保存配置,把当前的IniCtrl类的配置重新写入ini文件。
   AddSetting:增加配置名称。

现在来学习一下如何使用这两个类,其实IniStruct只是在IniCtrl内部使用到,因此实际应用中是不需要使用到的,最重要的是如何使用IniCtrl类。
在使用<script language=JScript src="IniCtrl.js"></script>之后,我们就可以对其进行使用了。

新建ini文件
var Ini = new IniCtrl();
Ini.Create("setting.ini");

给setting.ini增加一个配置Server

Ini.AddSetting("Server");

给Server配置增加属性

Ini.select("Server");//要对某个配置进行操作之前请先选择它
Ini.setAttribute("Name","Localhost");
Ini.setAttribute("IP","127.0.0.1");

保存配置

Ini.save();

关闭文件

Ini.Close();

这个时候我们已经成功生成一个配置文件setting.ini,内容如下:

[Server]
Name=Localhost
IP=127.0.0.1

接下来我们学习如何对现有的ini文件进行修改。。文件为上例的setting.ini

打开setting.ini

Ini.Open("setting.ini");

修改Server配置的Name参数值

Ini.select("Server");
Ini.setAttribute("Name","BennyHome");

再增加一个配置

Ini.AddSetting("Admin");

给Admin配置增加属性

Ini.select("Admin");
Ini.setAttribute("User","泣红亭");
Ini.setAttribute("Psw","benny");

得到Server配置的IP属性

Ini.select("Server");
var IP = Ini.getAttribute("IP");
alert(IP); //127.0.0.1

保存修改过的文件setting.ini

Ini.save();
Ini.Close();

操作后打开setting.ini可以看到内容为
[Server]
Name=BennyHome
IP=127.0.0.1
[Admin]
User=泣红亭
Psw=benny