ごまなつ Blog

楽しく働ける世界を目指して

【C#】WritePrivateProfileStringでハマった

WritePrivateProfileStringは、Windowsapi関数でiniファイルを扱う関数の一つです。他には、

  • GetPrivateProfileInt (iniファイルから数値を読みとる)
  • WritePrivateProfileString (iniファイルに文字列を書き込む)
  • GetPrivateProfileSectionNames (iniファイル中のすべてのセクション名を列挙する)
  • GetPrivateProfileSection (iniファイル中の指定されたセクション中のすべてキーと値のペアを列挙する)

といったものがあります。

iniファイルの形式

iniファイルの形式は、以下のようになります。

[section1]
key1 = hoge
key2 = huga
[section2]
length = 3
max = 255

つまり、

[セクション名]
データ1=値1
データ2=値2

といったセクションを並べていくファイル形式です。このファイルに対して、最初に述べた関数を用いることで、セクション名や、任意のセクションのデータを取得・書き込みができます。

陥った状況

WritePrivateProfileStringは、書き込みしようとしたデータのセクションとデータ名があった場合は上書き、無い場合は新規に書くというものです。しかし、

[section1]
key1 = hoge
key2 = huga
[section2]
length = 3
max = 255

に対してsection1のkey1をhogehogeに上書きしようとすると、

[section1]
value1 = hoge
value2 = huga
[section2]
length = 3
max = 255
[section1]
value1 = hogehoge

というように一番上のセクションが認識されないという状況になりました。

そもそも使用を推奨されていなかった

この関数は、16 ビット Windows ベースのアプリケーションとの互換性を保つ目的でのみ提供されています。つまり、使用は推奨されておらず、メンテナンスも行われていません。調べてたどり着くページも古いものばかりでした。

json形式に変更

json形式に変更することにしました。C#ではjsonのシリアライザとデシリアライザが用意されているのでうまく扱えます。

使っている関数が現在のバージョンでサポートされているか、調べることが重要だと感じました。