VB.NET Tips - INIファイル読み書き処理
INIファイルというと今更感がありますが、
簡単にプログラムの動作パラメータなどを保存しておくには便利な機能です。
私もプログラムの変更なしに、外からタイミングの時間の値を後から少し変えたい場合によく使います。
INIファイルの構造は以下の様になります。
[SECTION1]
KEY1=keydata1
KEY2=keydata2
[SECTION2]
KEYA=keydataA
...
■セクション
[] で囲まれた部分がセクションで、各セクションの中にキー文字列を宣言します。
■キー
各セクションの中に宣言される文字列で、その値を
= で定義します。
セクションが異なれば、同じキーが在ってもOKです。
■コメント
先頭に
;(セミコロン) を置くとその行はコメント行とみなされます。
また、行の途中に
;(セミコロン) が在ると、それ以降はコメントであるとみなされます。
■エスケープシーケンス
キーの値の文字列として
;(セミコロン)
:(コロン)
=(等号)
#(シャープ)
の各文字を含めたい場合があります。その時には各文字の前に
\(円マーク) を置きエスケープしてやります。
(以下のソースのクラスではエスケープシーケンスの設定と解除を関数化しています)
以下にINIファイルを取り扱うクラスのソースを示します。
INIファイル読み書きクラス
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 |
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 |
018 | Private strIniFileName As String = "" |
024 | Sub New ( ByVal strIniFile As String ) |
025 | Me .strIniFileName = strIniFile |
035 | Public Function GetProfileString( ByVal strAppName As String , _ |
036 | ByVal strKeyName As String , _ |
037 | ByVal strDefault As String ) As String |
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) |
043 | Return ResetEscape(strWork.ToString()) |
047 | Catch ex As Exception |
059 | Public Function WriteProfileString( ByVal strAppName As String , _ |
060 | ByVal strKeyName As String , _ |
061 | ByVal strSet As String ) As Boolean |
064 | Dim strCnv As String = SetEscape(strSet) |
065 | Dim intRet As Integer = WritePrivateProfileString(strAppName, strKeyName, strCnv, strIniFileName) |
071 | Catch ex As Exception |
081 | Private Function SetEscape( ByVal strSet As String ) As String |
082 | Dim strEscape As String = ";#=:" |
083 | Dim strRet As String = strSet |
085 | For i = 0 To strEscape.Length - 1 |
086 | Dim str As String = strEscape.Substring(i, 1) |
087 | strRet = strRet.Replace(str, "\" & str) |
090 | Catch ex As Exception |
100 | Private Function ResetEscape( ByVal strSet As String ) As String |
101 | Dim strEscape As String = ";#=:" |
102 | Dim strRet As String = strSet |
104 | For i = 0 To strEscape.Length - 1 |
105 | Dim str As String = strEscape.Substring(i, 1) |
106 | strRet = strRet.Replace("\" & str, str) |
109 | Catch ex As Exception |
このクラスを利用する例を以下に記します。
このボタン処理内では、最初にINIファイルへの書き込みを行い、その後でそのINIファイルからの読込を行っています。
01 | Private Sub ButtonIni_Click(sender As Object , e As EventArgs) Handles ButtonIni.Click |
03 | Dim strPath As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath) |
05 | Dim Ini As New ClsIni(strPath & "\TEST.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" ) |
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() |
INIファイルへの書込みでエスケープしないといけない文字を含んでいますので、
このプログラムを実行し「TEST.INI」をテキストエディタで確認すると、
\(円マーク) が付加されて書き込まれているのがわかるはずです。