◆ [VBScript] iniファイルをDelphi風(TIniFile)に処理する
どーもボキです。

iniファイルとは、以下のように記述されたテキストファイルのこと。
アプリの設定情報の保存などに良く使われている。
[セクション1]
キー1=値
キー2=値
キー3=値
Delphi の TIniFile風に使えるクラスを作った。

DelphiではCreateでオブジェクトを作成するが、このクラスではファイルを指定する意味で使うので、
OpenFile という名前のSubプロシージャにしている。

【使い方】
Dim ini
Set ini = New TIniFile

' iniファイルを開く
ini.OpenFile("D:\テスト.ini")

' iniファイルを読み込む
WScript.Echo ini.ReadValue("sec3","key10",-1)

For i = 1 To 3
For j = 1 To 10
' iniファイルに書き込む
ini.WriteValue "sec" & i,"key" & j, (i-1)*10+j
Next
Next

【TIniFileクラスのプログラム】
Class TIniFile
Private objFS
Private FPath
Private Lines

' iniファイルを開く
' FilePath : ファイルパス
Public Sub OpenFile(FilePath)
Dim file

Set objFS = CreateObject("Scripting.FileSystemObject")
FPath = FilePath
If objFS.FileExists(FPath) Then
Set file = objFS.OpenTextFile(FPath ,1)
Lines = Split(File.ReadAll,vbNewLine,-1,vbTextCompare)
file.Close
Else
Redim Lines(0)
End If
End Sub

' iniファイルを読み込む
' sSec : セクション名
' sKey : キー名
' DefValue : キー名が存在しなかった場合の戻り値
' 戻り値 : 読み込んだ値
Public Function ReadValue(sSec,sKey,DefValue)
Dim i,s,b

b = False
ReadValue = DefValue
For i = 0 To UBound(Lines) -1:Do
s = Replace(Replace(Lines(i),vbCR,""),vbLF,"")
If (Left(s,1) = "[") and (Right(s,1) = "]") Then
If b and (s <> "[" & sSec & "]") Then Exit Function
b = (s = "[" & sSec & "]")
End If
If Not b Then Exit Do
If InStr(s,sKey & "=") <> 1 Then Exit Do

ReadValue = Right(s,Len(s)-InStrRev(s,"="))
Loop Until 1 :Next
End Function

' iniファイルに書き込む
' sSec : セクション名
' sKey : キー名
' DefValue : 書き込む値
' ※WriteValue実行毎に、FilePathで指定したファイルを更新(作成)する
Public Sub WriteValue(sSec,sKey,Value)
Dim i,s,s_out,b_sec,b_out,file

b_sec = False
b_out = False
s_out = sKey & "=" & Value
Set file = objFS.OpenTextFile(FPath, 2, True)
For i = 0 To UBound(Lines) -1
s = Replace(Replace(Lines(i),vbCR,""),vbLF,"")
If (Left(s,1) = "[") and (Right(s,1) = "]") Then
If b_sec Then
If Not b_out Then
file.WriteLine s_out
b_out = True
End If
Else
b_sec = (s = "[" & sSec & "]")
End If
file.WriteLine s
ElseIf b_sec and InStr(s,sKey & "=") = 1 Then
file.WriteLine s_out
b_out = True
Else
file.WriteLine s
End If
Next
If Not b_sec Then file.WriteLine "[" & sSec & "]"
If Not b_out Then file.WriteLine s_out
file.Close
OpenFile(FPath)
End Sub
End Class


TIniFileのようなクラスを作っておけば、
「あるiniファイルの内容を別のiniファイルに反映する」 といった作業がとてもやりやすくなる。

今回は、慣れているDelphiの処理方法をそのままVBSで実現してみた。
ReadValue時に、セクション名&キー名の大文字・小文字を区別するので注意。
大文字・小文字の区別がイヤなら、文字を読み出す前にLCase/UCaseでどちらかに統一しておけばいい。

VBScriptには構造体がないが、クラスを使うことで構造体を代用することが出来る。
クラスって便利だ。
[PR]
by yozda | 2010-01-02 01:33 | プログラミング | Trackback | Comments(0)
トラックバックURL : http://yozda.exblog.jp/tb/9552062
トラックバックする(会員専用) [ヘルプ]
<< 命名 2010年1月1日 新年のご挨拶 >>