VB.NET Tips - INIファイル読み書き処理

INIファイルというと今更感がありますが、 簡単にプログラムの動作パラメータなどを保存しておくには便利な機能です。 私もプログラムの変更なしに、外からタイミングの時間の値を後から少し変えたい場合によく使います。

INIファイルの構造は以下の様になります。

[SECTION1]
KEY1=keydata1
KEY2=keydata2

[SECTION2]
KEYA=keydataA
...
■セクション
[] で囲まれた部分がセクションで、各セクションの中にキー文字列を宣言します。

■キー
各セクションの中に宣言される文字列で、その値を = で定義します。
セクションが異なれば、同じキーが在ってもOKです。

■コメント
先頭に ;(セミコロン) を置くとその行はコメント行とみなされます。
また、行の途中に ;(セミコロン) が在ると、それ以降はコメントであるとみなされます。

■エスケープシーケンス
キーの値の文字列として ;(セミコロン) :(コロン) =(等号) #(シャープ)  の各文字を含めたい場合があります。その時には各文字の前に \(円マーク) を置きエスケープしてやります。
(以下のソースのクラスではエスケープシーケンスの設定と解除を関数化しています)

以下にINIファイルを取り扱うクラスのソースを示します。

INIファイル読み書きクラス

001Public Class ClsIni
002    'プロファイル文字列取得
003    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
004       ByVal lpApplicationName As String, _
005       ByVal lpKeyName As String, _
006       ByVal lpDefault As String, _
007       ByVal lpReturnedString As System.Text.StringBuilder, _
008       ByVal nSize As UInt32, _
009       ByVal lpFileName As String) As UInt32
010 
011    'プロファイル文字列書込み
012    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
013        ByVal lpAppName As String, _
014        ByVal lpKeyName As String, _
015        ByVal lpString As String, _
016        ByVal lpFileName As String) As Integer
017 
018    Private strIniFileName As String = ""
019 
020    ''' <summary>
021    ''' コンストラクタ
022    ''' </summary>
023    ''' <param name="strIniFile">INIファイル名(フルパス)
024    Sub New(ByVal strIniFile As String)
025        Me.strIniFileName = strIniFile  'ファイル名退避
026    End Sub
027 
028    ''' <summary>
029    ''' プロファイル文字列取得
030    ''' </summary>
031    ''' <param name="strAppName">アプリケーション文字列
032    ''' <param name="strKeyName">キー文字列
033    ''' <param name="strDefault">デフォルト文字列
034    ''' <returns>プロファイル文字列</returns>
035    Public Function GetProfileString(ByVal strAppName As String, _
036                                     ByVal strKeyName As String, _
037                                     ByVal strDefault As String) As String
038        Try
039            Dim strWork As System.Text.StringBuilder = New System.Text.StringBuilder(1024)
040            Dim intRet As Integer = GetPrivateProfileString(strAppName, strKeyName, strDefault, strWork, strWork.Capacity - 1, strIniFileName)
041            If intRet > 0 Then
042                'エスケープ文字を解除して返す
043                Return ResetEscape(strWork.ToString())
044            Else
045                Return strDefault
046            End If
047        Catch ex As Exception
048            Return strDefault
049        End Try
050    End Function
051 
052    ''' <summary>
053    ''' プロファイル文字列設定
054    ''' </summary>
055    ''' <param name="strAppName">アプリケーション文字列
056    ''' <param name="strKeyName">キー文字列
057    ''' <param name="strSet">設定文字列
058    ''' <returns>True:正常, False:エラー</returns>
059    Public Function WriteProfileString(ByVal strAppName As String, _
060                                       ByVal strKeyName As String, _
061                                       ByVal strSet As String) As Boolean
062        Try
063            'エスケープ文字変換
064            Dim strCnv As String = SetEscape(strSet)
065            Dim intRet As Integer = WritePrivateProfileString(strAppName, strKeyName, strCnv, strIniFileName)
066            If intRet > 0 Then
067                Return True
068            Else
069                Return False
070            End If
071        Catch ex As Exception
072            Return False
073        End Try
074    End Function
075 
076    ''' <summary>
077    ''' エスケープ文字変換
078    ''' </summary>
079    ''' <param name="strSet">設定文字列
080    ''' <returns>変換後文字列</returns>
081    Private Function SetEscape(ByVal strSet As String) As String
082        Dim strEscape As String = ";#=:"
083        Dim strRet As String = strSet
084        Try
085            For i = 0 To strEscape.Length - 1
086                Dim str As String = strEscape.Substring(i, 1)
087                strRet = strRet.Replace(str, "\" & str)
088            Next
089            Return strRet
090        Catch ex As Exception
091            Return ""
092        End Try
093    End Function
094 
095    ''' <summary>
096    ''' エスケープ文字解除
097    ''' </summary>
098    ''' <param name="strSet">設定文字列
099    ''' <returns>変換後文字列</returns>
100    Private Function ResetEscape(ByVal strSet As String) As String
101        Dim strEscape As String = ";#=:"
102        Dim strRet As String = strSet
103        Try
104            For i = 0 To strEscape.Length - 1
105                Dim str As String = strEscape.Substring(i, 1)
106                strRet = strRet.Replace("\" & str, str)
107            Next
108            Return strRet
109        Catch ex As Exception
110            Return ""
111        End Try
112    End Function
113End Class

このクラスを利用する例を以下に記します。 このボタン処理内では、最初にINIファイルへの書き込みを行い、その後でそのINIファイルからの読込を行っています。
01Private Sub ButtonIni_Click(sender As Object, e As EventArgs) Handles ButtonIni.Click
02    '自分自身の存在するフォルダ
03    Dim strPath As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath)
04    'INIファイルクラスの生成
05    Dim Ini As New ClsIni(strPath & "\TEST.INI")
06    'INIファイルへの書込みテスト
07    Ini.WriteProfileString("SECTION1", "DATA1", "test-data-1:aaa")
08    Ini.WriteProfileString("SECTION1", "DATA2", "test-data-2;bbb")
09    Ini.WriteProfileString("SECTION2", "DATA1", "TEST-DATA-1=:;#AAA")
10 
11    'INIファイルからの取得テスト
12    Dim str As String
13    str = Ini.GetProfileString("SECTION1", "DATA1", "default-data-1:aaa")
14    Console.WriteLine("SECTION1:DATA1=" & str)
15    str = Ini.GetProfileString("SECTION1", "DATA2", "default-data-2;bbb")
16    Console.WriteLine("SECTION1:DATA2=" & str)
17    str = Ini.GetProfileString("SECTION2", "DATA1", "default-DATA-1=:;#AAA")
18    Console.WriteLine("SECTION2:DATA1=" & str)
19    str = Console.ReadLine()
20End Sub
INIファイルへの書込みでエスケープしないといけない文字を含んでいますので、 このプログラムを実行し「TEST.INI」をテキストエディタで確認すると、  \(円マーク) が付加されて書き込まれているのがわかるはずです。

総アクセス数