見出し画像

【VB.NET】INIファイルに文字列を書き込む42歳(´'ω'`)

※投稿時点の年齢

残業と内勤を終えて22時前にも係わらずこれを書き始めているあらきです。

前回からやたら時間が空いてしまいましたが「INIファイルからの文字列読み込み」ときたら「文字列の書き込みでしょう」ということでそのコードを記録します。
→ぶっちゃけ、自分は基本「全部文字列で読み書き、その後に各形式に変換」のスタイルでいってるので基本的な入出力はこれだけで済ましてたりします。


主に使う関数:WritePrivateProfileString
参照するAPI:kernel32.dll

■概要
INIファイルに文字列を読み込む時と同様、書き込む際にも「WIN32API」の処理を呼び出します。
こちらはあまり考えることはなく、とにかく「セクション名」「キー名」を指定して書き込むばっかりです。
※理由は後述

■前提
OS:Windows 8以降(下記の.NET Frameworkが入ってれば動くはず)
使用する言語:VB.NET
.NET Framework:4.6.2

■APIの定義

'WIN32API:INIファイルに文字列値を書き込む
[引数]
'   1:lpApplicationName String セクション名
'   2:lpKeyName         String キー名
'   3:lpString          String 入力値
'   4:lpFileName        String 対象ファイルのパス
'[戻値]
'   成功判定:成功した場合は 0 以外の数値を返す
Private Declare Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (
        ByVal lpApplicationName As String,
        ByVal lpKeyName As String,
        ByVal lpString As String,
        ByVal lpFileName As String
    ) As Integer

※コメントに引数・返値を記載します。
まず、WIN32APIの関数を呼び出す定義です。
こちらの場合、とにかく書き込むのみなので引数は全部文字列型です。
返値については、GetPrivateProfileString(読み込み)と違い、Integer(符号付き整数型)になるので注意です。
※こっちも出来た頃はLong型にて記述されていた気がする

こちらについてもこのままではアレなので値書き込み用の関数(Functionプロシージャ)を作成して使用します。

■書込み用の関数

'INIファイルの文字列値を書き込む
'[引数]
'   1:apathTarget String 対象ファイルのパス
'   2:astrSection String セクション名
'   3:astrKey     String キー名
'   4:astrInput   String 入力値
'[戻値]
'   成功判定    
Friend Function KeyValueWriteString(ByVal apathTarget As String, ByVal astrSection As String, ByVal astrKey As String, ByVal astrInput As String) As Boolean

    Dim retDecision As Boolean = False      '戻値:成功判定

    Dim lngReturn As Long                   '関数戻値


    Try
        '■API実行はここ!
        lngReturn = WritePrivateProfileString(astrSection, astrKey, astrInput, apathTarget)

        '実行結果判定
        retDecision = (lngReturn > 0)

    Catch
        retDecision = False

    End Try

    Return retDecision

End Function

正直、引数は変わらず返値を整数型からブール型にしてるだけなので意味は無さそうですが、まぁ書き込み処理とレベルを合わせるためにこうしてるくらいなモンだったりします。

■自分はこうしてる
自分がINIファイルを取り扱う際、基本的にはこの「文字列の読み書き」を基本にして「各種データ型を変換して取り扱う」ようにしています。
自分は「アプリケーションと設定ファイルの間は文字列でやりとりする」「アプリケーション内にてデータ型を良い感じに調整する」の2段構え(クラスとして作る場合はデータ型変換を延々追加する)でシンプルに考えることができています。

※そして上の方にあった「理由は後述」の理由
もし、「存在しないセクション名」「存在しないキー名」を指定して値を書き込むとどうなるかについて、答は「INIファイルにセクション名・キー名を追記して書き込む」になります。
存在しなくても良い具合に書いてくれるので便利と取れる反面、「セクション・キーの存在を気にしない」ためすぐ無法地帯になる可能性があります。
そのための対処として「セクション・キーを一覧取得して存在判定する」などの対応も考えられますがその内、と言うことで・・・

■いかがでしたか?(〆の挨拶)
読み書き共に、ですが実際に書くときはどこかしらに「INIファイルが存在するか」判定した上で処理を行っています。

'こんな感じ
If System.IO.File.Exists(apathTarget) = False Then Return False

※クラスの場合はパス書き込み時に判定

こうすることでそもそも無いときに関数呼び出しを回避してリスクを抑えていたりもします。
また、今回解説した書き込みの際には「セクション・キーがなくても書き込むか」についてもフラグを引数に持たせたりもします。
→そこら辺のケアというかどこまで考えるかもその人のセンスというか作風になっていくのかも知れません。
自分は心配しすぎて長くなりますが・・・・・・・・・・・


この記事が気に入ったらサポートをしてみませんか?