ユーザーがファイルの編集を直接行う場合、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 件のコメント:
コメントを投稿