VB.NET Tips - INIファイル読み書き処理
INIファイルというと今更感がありますが、
簡単にプログラムの動作パラメータなどを保存しておくには便利な機能です。
私もプログラムの変更なしに、外からタイミングの時間の値を後から少し変えたい場合によく使います。
INIファイルの構造は以下の様になります。
[SECTION1] KEY1=keydata1 KEY2=keydata2 [SECTION2] KEYA=keydataA ...■セクション
[] で囲まれた部分がセクションで、各セクションの中にキー文字列を宣言します。
■キー
各セクションの中に宣言される文字列で、その値を = で定義します。
セクションが異なれば、同じキーが在ってもOKです。
■コメント
先頭に ;(セミコロン) を置くとその行はコメント行とみなされます。
また、行の途中に ;(セミコロン) が在ると、それ以降はコメントであるとみなされます。
■エスケープシーケンス
キーの値の文字列として ;(セミコロン) :(コロン) =(等号) #(シャープ) の各文字を含めたい場合があります。その時には各文字の前に \(円マーク) を置きエスケープしてやります。
(以下のソースのクラスではエスケープシーケンスの設定と解除を関数化しています)
以下にINIファイルを取り扱うクラスのソースを示します。
INIファイル読み書きクラス
Public Class ClsIni 'プロファイル文字列取得 Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _ ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As System.Text.StringBuilder, _ ByVal nSize As UInt32, _ ByVal lpFileName As String) As UInt32 'プロファイル文字列書込み Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal lpAppName As String, _ ByVal lpKeyName As String, _ ByVal lpString As String, _ ByVal lpFileName As String) As Integer Private strIniFileName As String = "" '''''' コンストラクタ ''' ''' INIファイル名(フルパス) Sub New(ByVal strIniFile As String) Me.strIniFileName = strIniFile 'ファイル名退避 End Sub '''''' プロファイル文字列取得 ''' ''' アプリケーション文字列 ''' キー文字列 ''' デフォルト文字列 '''プロファイル文字列 Public Function GetProfileString(ByVal strAppName As String, _ ByVal strKeyName As String, _ ByVal strDefault As String) As String Try Dim strWork As System.Text.StringBuilder = New System.Text.StringBuilder(1024) Dim intRet As Integer = GetPrivateProfileString(strAppName, strKeyName, strDefault, strWork, strWork.Capacity - 1, strIniFileName) If intRet > 0 Then 'エスケープ文字を解除して返す Return ResetEscape(strWork.ToString()) Else Return strDefault End If Catch ex As Exception Return strDefault End Try End Function '''''' プロファイル文字列設定 ''' ''' アプリケーション文字列 ''' キー文字列 ''' 設定文字列 '''True:正常, False:エラー Public Function WriteProfileString(ByVal strAppName As String, _ ByVal strKeyName As String, _ ByVal strSet As String) As Boolean Try 'エスケープ文字変換 Dim strCnv As String = SetEscape(strSet) Dim intRet As Integer = WritePrivateProfileString(strAppName, strKeyName, strCnv, strIniFileName) If intRet > 0 Then Return True Else Return False End If Catch ex As Exception Return False End Try End Function '''''' エスケープ文字変換 ''' ''' 設定文字列 '''変換後文字列 Private Function SetEscape(ByVal strSet As String) As String Dim strEscape As String = ";#=:" Dim strRet As String = strSet Try For i = 0 To strEscape.Length - 1 Dim str As String = strEscape.Substring(i, 1) strRet = strRet.Replace(str, "\" & str) Next Return strRet Catch ex As Exception Return "" End Try End Function '''''' エスケープ文字解除 ''' ''' 設定文字列 '''変換後文字列 Private Function ResetEscape(ByVal strSet As String) As String Dim strEscape As String = ";#=:" Dim strRet As String = strSet Try For i = 0 To strEscape.Length - 1 Dim str As String = strEscape.Substring(i, 1) strRet = strRet.Replace("\" & str, str) Next Return strRet Catch ex As Exception Return "" End Try End Function End Class
このクラスを利用する例を以下に記します。 このボタン処理内では、最初にINIファイルへの書き込みを行い、その後でそのINIファイルからの読込を行っています。
Private Sub ButtonIni_Click(sender As Object, e As EventArgs) Handles ButtonIni.Click '自分自身の存在するフォルダ Dim strPath As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath) 'INIファイルクラスの生成 Dim Ini As New ClsIni(strPath & "\TEST.INI") 'INIファイルへの書込みテスト Ini.WriteProfileString("SECTION1", "DATA1", "test-data-1:aaa") Ini.WriteProfileString("SECTION1", "DATA2", "test-data-2;bbb") Ini.WriteProfileString("SECTION2", "DATA1", "TEST-DATA-1=:;#AAA") 'INIファイルからの取得テスト Dim str As String str = Ini.GetProfileString("SECTION1", "DATA1", "default-data-1:aaa") Console.WriteLine("SECTION1:DATA1=" & str) str = Ini.GetProfileString("SECTION1", "DATA2", "default-data-2;bbb") Console.WriteLine("SECTION1:DATA2=" & str) str = Ini.GetProfileString("SECTION2", "DATA1", "default-DATA-1=:;#AAA") Console.WriteLine("SECTION2:DATA1=" & str) str = Console.ReadLine() End SubINIファイルへの書込みでエスケープしないといけない文字を含んでいますので、 このプログラムを実行し「TEST.INI」をテキストエディタで確認すると、 \(円マーク) が付加されて書き込まれているのがわかるはずです。