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();
	}
};
}}
改造点は、まず、コメント行であるかを確認し、キーネームと値を=で分割して、キーネームの末尾の空白文字と、値の前の空白文字を削除して格納する。