读写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