【C#】INIファイルクラス【自作】

C#

はじめに

INIファイルの入出力を行うクラスを作成しました。

C#でINIファイルを操作する方法は、デフォルトでは用意されていません。
メジャーなのはWin32のGetPrivateProfileStringやWritePrivateProfileStringを使用する方法でしょうか。

初期化ファイル内の指定したセクションから文字列を取得します。

GetPrivateProfileString function (winbase.h) – Win32 apps | Microsoft Docs

ただし、Win32だとDLLImportが必要なのと、読込みの度にファイルアクセスが必要だったりで、微妙に使いづらいなと個人的に思ったりします。

自作INIファイルクラス

今回作成したINIファイルクラスでは、メモリにINIファイルの内容を保持するため、ファイルアクセスは初回の読込み時と出力時のみです。
今時のPCでINIファイル程度のサイズならメモリ使用量も気にする必要はないと思いますので、問題はないと考えます。
メモリに保持するといっても、Dictionaryに読み込むだけです。マネージドです。

ごりへい
ごりへい

メモリを気にするならWinFormsではなく、C++でアプリケーションを作成する方がずっと効果的ウホ

また、コメントの読込み、出力、エンコーディング指定に対応しています。

IniFile.cs

IFile.cs

IFile.csは他に作成しているCSVやPDF等の自作クラスを共通で処理するためのインターフェイスなので、あまり気にしないでください。

 

説明

関数コメントに記載しているため不要かもしれませんが、軽く説明します。

ファイルの読込み

ファイルのパスを指定してインスタンスを初期化します。
処理としては、INIファイルを行毎に正規表現で解析してDictionaryに追加していくだけです。

ファイルパスを指定せずにインスタンスを初期化する事も可能です。
その場合、値を設定して出力することでINIファイルを作成する事が出来ます。

値の取得、設定

値を取得する方法は2つあります。
GetValueとインデクサーを使用する方法です。

インデクサーとは
インデクサーを使用すると、配列と同じようにクラスまたは構造体のインスタンスにインデックスを作成することができます。 インデックス値は、型またはインスタンス メンバーの明示的な指定なしで設定または取得できます。 インデクサーはプロパティと似ていますが、そのアクセサーがパラメーターを取る点が異なります。

インデクサー – C# プログラミング ガイド | Microsoft Docs

インデクサーで値を取得する場合、ini[“セクション”, “キー”]で値を取得出来ます。
ただし、IniFileクラスはジェネリッククラスではないため、インデクサーにジェネリックを使用できません。そのため、string型でのアクセスとなります。

GetValueで値を取得する場合、ini.GetValue<T>(“セクション”, “キー”)で値を取得できます。
string型以外の型で値を取得する場合はGetValueを使用します。

値を設定する方法も取得する場合と同様、2つあります。
SetValueとインデクサーを使用する方法です。
使用方法は設定する方法と同様なので省略します。

ファイル出力

Save関数でファイルを出力します。
ファイルを読み込んでいる場合に引数を指定しなければ上書き出力となります。
引数で出力先パスを指定した場合、指定したパスに出力します。

まとめ

今回作成したINIファイルクラスでは、以下の点がWin32より優れている点、劣っている点を挙げてみます。(主観)

  • 値の取得、設定の度にファイルアクセスが発生しない。
  • DLLImportを使用しなくてよい。
  • 直感的に操作しやすい。(個人の主観ばりばり入ってます)
  • ファイルエンコーディングが指定出来る。
  • コメントの読込み、出力に対応。
  • 広く普及しているWin32の仕様と異なる為、人によっては使いにくく感じる。
  • メモリにファイルを読み込む為、メモリを圧迫する。

上記の挙げた通り、ほぼデメリットは無いと思っています。
何かありましたら気軽にコメントを頂けますと幸いです。

また、コードはご自由にご自由にコピペしていただいて構いませんが、利用によって生じた損害等の一切の責任を負いかねますのでご了承ください。

おまけ

最近はめっきりINIファイルを使用する事がなくなりましたので、需要はほぼないかもしれません。
ごりへい自身、INIファイルを使用する事はほぼないですし、あまり使いたくありません。
今時のアプリケーションはJsonまたはxmlでシリアライズするのがモダンなやり方ですよね。

ただ、たまに

お客
お客

Jsonやxmlはよくわからん!INIファイルを使え!INIファイルを!

というお客様もいるので、そんな時お役に立てれば幸いです。

C#プログラミング
凡人プログラマーのブログ

コメント