ユーザーがファイルの編集を直接行う場合、iniファイルで作ることがあります。
設定画面を設けxmlファイルに保存する事がよいのではと思うのですが
そこは大人の事情で設定画面を設けずiniファイルでとなるわけですね。
そんな自分へのメモ。
iniファイルの記述形式は以下のように、keyとvalueが「=」で区切られており「//」以降はコメントとして無視します。
項目名(key)=値(value) //コメント
iniファイルを読み込みiniSettingクラスのフィールドに値を設定します。
iniファイルは直接編集が前提ですので、書き込みメソッドはありません。
またiniSettingクラスのプロパティもReadOnlyにしています。
アプリ全体で使用するのでiniSettingクラスはシングルトンにしています。
Public Class IniSetting
'-----定数-----
''' <summary>Iniファイル名</summary>
Private Shared ReadOnly IniFileName As String = "ini.txt"
''' <summary>Iniファイルパス</summary>
Private Shared ReadOnly IniFilePath As String = System.IO.Path.Combine(Application.StartupPath, IniFileName)
''' <summary>エンコード</summary>
Private Shared ReadOnly ENC As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_Jis")
'----staticフィールド----
''' <summary>自分自身のインスタンス</summary>
Private Shared _Instance As IniSetting
'----staticプロパティ----
''' <summary>自分自身のインスタンスを取得します</summary>
Public Shared ReadOnly Property Instance() As IniSetting
Get
Return _Instance
End Get
End Property
'----staticメソッド----
''' <summary>
''' 項目名=設定値 //コメント等
''' </summary>
''' <remarks></remarks>
Public Shared Sub Load()
'iniファイルよりに記載された項目名=設定値を読み取り、DictionaryのKeyとValueに設定します。
Dim lstIni As New Dictionary(Of String, String)
lstIni = LoadIni(IniFilePath, ENC)
'IniSettingクラスのインスタンスを作成しフィールドに設定する
Dim key As String
_Instance = New IniSetting
'--Item1
key = "項目1"
If Not lstIni.ContainsKey(key) Then
Throw New FormatException(String.Format("{0}ファイルに{1}が設定されていません。", IniFileName, key))
End If
_Instance._Item1 = lstIni.Item(key).ToString
'--Item2
key = "項目2"
If Not lstIni.ContainsKey(key) Then
Throw New FormatException(String.Format("{0}ファイルに{1}が設定されていません。", IniFileName, key))
End If
If Integer.TryParse(lstIni.Item(key), _Instance._Item2) = False Then
Throw New FormatException(String.Format("{0}ファイルの{1}が数値に変換できません。", IniFileName, key))
End If
End Sub
''' <summary>
''' iniファイルよりに記載された項目名=設定値を読み取り、DictionaryのKeyとValueに設定し返します。
''' </summary>
''' <param name="path"></param>
''' <param name="enc"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Shared Function LoadIni(ByVal path As String, ByVal enc As System.Text.Encoding) As Dictionary(Of String, String)
Dim fileName As String = System.IO.Path.GetFileName(path)
Dim lstIni As New Dictionary(Of String, String)
If Not System.IO.File.Exists(path) Then
Throw New System.IO.FileNotFoundException(String.Format("{0}ファイルを配置してください。", path))
End If
Dim sr As New System.IO.StreamReader(path, enc)
Try
While sr.Peek() > -1
Dim s As String = sr.ReadLine
If Not String.IsNullOrEmpty(s) Then
'--コメントを削除
s = System.Text.RegularExpressions.Regex.Replace(s, "//.*", "")
'--コメントまでにタブが入る可能性があるので削除
s = s.Replace(vbTab, String.Empty)
Dim ary As String() = s.Split("="c)
If ary.Length <> 2 Then
Throw New FormatException(String.Format("{0}ファイルの設定が不正です。" & vbCrLf & "項目名=設定値 の形式で記載されているか確認してください。", fileName))
Else
lstIni.Add(Trim(ary(0)), Trim(ary(1)))
End If
End If
End While
sr.Close()
Finally
sr = Nothing
End Try
Return lstIni
End Function
'----コンストラクタ----
''' <summary>
''' コンストラクタ
''' </summary>
''' <remarks></remarks>
Private Sub New()
'隠匿
End Sub
'-----フィールド-----
Private _Item1 As String
Private _Item2 As Integer
'-----プロパティ-----
Public ReadOnly Property Item1() As String
Get
Return Me._Item1
End Get
End Property
Public ReadOnly Property Item2() As Integer
Get
Return _Item2
End Get
End Property
End Class
使用方法
'アプリ起動時などでLoadしておく。 IniSetting.Load() 'IniSettingのInstance経由でプロパティにアクセスする。 Console.WriteLine(IniSetting.Instance.Item1) Console.WriteLine(IniSetting.Instance.Item2)
0 件のコメント:
コメントを投稿