各種エクスポータで INI を使ってデータを保存する方法まとめ


データをテキストで保存をする際に必須なのが INI Object です。標準機能的なエクステンションなのですが、エクスポータ毎に保存方法が多少異なります。それらをまとめてみました。

ini_object_icon_big_cf25

基本的な使い方はファイルパス + ファイル名を指定しての読み書きですが、OS の種類によっては保存する場所が予め指定されていたり任意の場所へファイルの保存を許可しない設定になっています。


複数のエクスポータを使って互換性を維持しながらデータを保存する際、なるべくトラブルも無く一番簡単に実現可能な「 INI のファイル指定方法」はどうしたらいいのか。

サンプルファイル ダウンロード( MMF2 で動作可能/コメント付き)
Defalult_SaveLoad_FunctionSample_INI_Object_MMF2

関連記事( MMF2 wiki ):テクニック集/セーブファイルを作る( Ini オブジェクト)

参考( Clickteam Forum ):Android Save ini Example

とにかくラクに読み書きを実現する方法

ファイルパスを一切指定せずに「名前」だけを指定する方法が一番ラク。

ただし INI Object のデフォルト動作なので自分が保存したい場所に保存はできません。データが保存される場所は各 OS 、エクスポータ毎に異なります。

ini_object_scrren shot

例えばこの書き方で読み書きを指定した場合、PC でまず動作確認したら確かに動くけどファイルは一体どこに保存されるのか。

OS が Windows 7 の場合
「 C:\Users\ユーザ名\AppData\Roaming\MMFApplications\ 」
フォルダを開けばそこに答えがあります。

saved_ini_files_sample_cf25

この書き方が一番トラブルもなく、各種エクスポータで使っても大丈夫な保存方法。

特にパーミッションの概念がはっきりとしているモバイル系 OS の仕様として、アプリごとに固有のデータを保存する場所が厳密に指定されていたりします。この場合は OS の仕様に沿ってデフォルトで保存してくれる INI Object に保存場所を一任すれば、簡単にセーブデータの読み書き実現ができるのでこの方法がオススメ。

Windows PC の場合

パーミッション(アクセス権限)の概念が薄い OS なのでかなり自由に保存場所を指定できます。とにかくゆるっゆるです。ビル・ゲイツもびっくり!

ある意味例外的な自由度なので、Windows PC での読み書き方法を他エクスポータでも共通して使おうとしないほうがトラブルも少ない。

この自由奔放な仕様は他 OS や HTTP などでは本来許されざるモノ、セキュリティが優先される場合この仕様が危険でもあるため Windows PC 並の保存先の自由度を、エクスポータを使った場合にはあえて求めない方がカンタンだし幸せになれます。

保存先の指定方法は複数あります。試したところ相対パスでは読み書き不可、「Apppath$」を使った指定が必須みたい。

ちなみに INI 以外の Object では相対パスの利用が可能な場合もあるので、このあたりをゴッチャにしない(自分が間違えていた点)。

"test"

前述したようにファイル名だけを指定すると
「 C:\Users\ユーザ名\AppData\Roaming\MMFApplications\ 」フォルダ
などにファイル名として利用されたファイルが自動で保存されます。
apppath$+"test.ini"

アプリケーション(EXE)のあるフォルダと同じ場所に保存されます。ini ファイルの内容をすぐ確認できるのが便利で動作確認時に普段からよく使う書き方。
apppath$+"/save/test.ini"

アプリケーション(EXE)のあるフォルダ以下に「 save 」というフォルダを作って、そこに保存する場合の書き方。この書き方も汎用性ありますが、アンドロイドとかモバイル系 OS では使わない方が吉。パーミションの概念が異なるからです。

この書き方の場合、save フォルダが事前に作られていないと読み書きできないのも要注意です。INI Object は存在しないフォルダを指定した場合、フォルダを自動で作って保存まではしてくれません。

SWF ( Flash )

基本的なファイルアクセスは HTTP ブラウザに依存します。クッキーを使った保存とは異なります。

"test"

前述したようにファイル名だけを指定するとブラウザの設定に沿った場所に保存されます。
apppath$+"test.ini"

PC とは動作原理が異なるため apppath$ の指定がある場合、エクスポータを使ってビルドする際に警告が出ます。この場合 apppath$ を消し去って "test.ini" だけ残せばビルド時の警告は消せます。あるいは "test" とだけ書けば良い。
apppath$+"/save/test.ini"

これも同前述、あるいは記述ルールとしては相対パスで書き直せます。 apppath$ を消し去った後、"/save/test.ini" を "./save/test.ini" と書くとかでも動きますが、この場合ビルド後に自分で save フォルダを作って FTP で SWF ファイル群と一緒にアップロードする必要があります。save フォルダを HTTP に作ってもこれでデータがサーバに保存されるわけではないから基本的に無駄だし、素直に "test" と名前だけ書いといたほうが効率的。

HTML5

SWF とほぼ同じです。ただし apppath$ を書いたままでも保存されます。データの保存先はこれもブラウザ設定に依存するためただ単に HTML5 エクスポータのセキュリティチェックが甘いだけな気もします。

アンドロイド、iOS などモバイル系

アンドロイドは Linux ベースのモバイル OS です。標準動作の場合、アプリケーション固有のデータファイルをローカルに保存する際には OS 指定の領域に保存されます。この仕様を無理に曲げようとしないほうがいいので、INI Object のデフォルトの保存先に保存してもらう記述方法が一番良いです。

"test"

ファイル名だけを指定することで INI Object が自動的にモバイル OS が割り当てた保存領域に名前付きで保存します。
apppath$+"test.ini"

この書き方でビルドした場合エクスポータが警告を出します。警告を無視してビルドしても読み書きはできないはず。apppath$ を消せば「"test.ini"」という「アプケーション名」として保存される可能性。素直に  「"test"」が無難。
apppath$+"/save/test.ini"

この書き方でビルドした場合エクスポータが警告を出します。警告を無視してビルドしても読み書きはできない。apppath$ を消して「"./save/test.ini"」という相対パスを使った書き方がおそらくできない(未確認)。

ということは INI のデフォルト動作にお任せする “test” という記述が一番ラク。

総括

考え方としては Windows PC が例外的にファイル読み書きは自由度高すぎるのだと考えたほうがいいです。

その弊害として INI 読み書きの記述方法は PC だと複数存在しますが、モバイルやウェブではセキュリティがしっかりしてますのでこのゆるい考え方を改める必要はあります。

エクスポータでは各エクスポート先の動作仕様に則った動作をしますので、自分が出力する形式についてある程度の理解や知識は必要です。

とにかく「ToLoveるっ!(トラブル)を避けたい!」「初心者です!」な場合は、保存先にはこだわらずに INI にお任せして自分でファイル名だけ決めるのがベスト。

Have Fun!

(この記事の元ネタは Twitter でのやりとりをまとめたものです)

Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です