Backup of blog/2009-02-08 (2) Back
Back to History list
#navi(../)
*JavaScriptでINIファイルを操作する [#n67d1f33]
このサイトで、JavaScriptでINIファイルを操作するスクリプトが公開されている。
http://shoji.blog1.fc2.com/blog-entry-130.html
たとえば、sample.iniというファイルを読み込む場合、
#code(javascript){{
var sampleini = new Ini('ample.ini');
}}
となる。そして、sample.iniの内容が以下のような場合、
#code(ini){{
[section]
main=1
sub=2
[section2]
main=2
sub=1
}}
JavaScriptでは、
#code(javascript){{
sampleini =
items : {
'section' : {
main : 1,
sub : 2
},
'section2' : {
main : 2,
sub : 1
}
}
};
}}
で読みこむことができる。
しかし、このままでは、
#code(ini){{
[section]
main = 1
;sub = 2
}}
というデーターが正常に処理できない。sub2はコメントアウトされているのに、mainの内容は読み込まれないし、subはコメントアウトされているにも関わらず、;subという形で読み込まれる。
そこで、以下のように書き換える
#code(javascript){{
// 各コンストラクタ
function Ini(){
this.initialize.apply(this,arguments);
}
// プロトタイプ
Ini.prototype = {
initialize: function(file) {
this.clear();
this.fso = new ActiveXObject("Scripting.FileSystemObject"); // FileSystemObjectを作成
if( file!=null ) this.open(file);
},
// clearメソッド - 全削除
clear: function() {
try { delete this.items; } catch(e) {}
this.items = new Array(); // 項目
this.filename = null; // ファイル名
},
// openメソッド - Iniファイルの読込
open: function(filename) {
try {
if (this.fso.FileExists(filename)){
var ini = this.fso.OpenTextFile(filename,1,false); // ファイルを開く
this.clear();
var sectionname = null;
var p = -1;
while( !ini.AtEndOfStream ){
var line = ini.ReadLine();
line = line.replace(/^[ \t]+/,""); // 先頭の空白は削除
if( !line.match(/^[ \t]*$/) ) // 空行ではない
{
if( line.match(/^\[(.+)\][ \t]*$/) ) // セクション行
{
sectionname = RegExp.$1;
this.items[ sectionname ] = new Array(); // セクション行を追加
} else if( sectionname != null && (p = line.indexOf('='))>=0 && !line.match(/^;/)) {
var thisline = line.split("=");
var keyname = thisline[0].replace(/[\s]$/,'');
var value = thisline[1].replace(/^[\s]/,'');
this.items[ sectionname ][ keyname ] = value;
}
}
}
this.filename = filename;
ini = null; delete ini;
return true;
}else{
alert('Not Found:' + filename);
}
}catch(e){
return false;
}
},
// updateメソッド - iniファイルの更新
update: function(filename) {
if( filename != null ) this.filename = filename;
try {
if (this.fso.FileExists(filename)){
var ini = this.fso.OpenTextFile(this.filename,2,true)
for( var sectionname in this.items ){
ini.WriteLine( '[' + sectionname + ']' );
for( var keyname in this.items[sectionname] )
ini.WriteLine( keyname + '=' + this.items[sectionname][keyname] );
ini.WriteLine( '' );
}
ini = null; delete ini;
return true;
}else{
alert('Not Found:' + filename);
}
}catch(e){
return false;
}
},
// getItemメソッド - 項目の値読み込み
getItem: function(sectionname, keyname) {
if( sectionname in this.items )
if( keyname in this.items[sectionname] )
return this.items[sectionname][keyname];
return '';
},
// setItemメソッド - 項目の値設定
setItem: function(sectionname, keyname, value, updateflag) {
if( updateflag == null ) updateflag = true;
if( !(sectionname in this.items) )
this.items[ sectionname ] = new Array();
this.items[ sectionname ][ keyname ] = value;
if( updateflag && this.filename!=null ) this.update();
}
};
}}
改造点は、まず、コメント行であるかを確認し、キーネームと値を=で分割して、キーネームの末尾の空白文字と、値の前の空白文字を削除して格納する。