× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
iPhone,iPadにはファイラが無い。
データやファイルはすべてアプリに紐づけられる。 そのアプリで作られたデータは、そのアプリからしか見えない。 そのデータを他のアプリや他の機器から参照することはできない。 それは良いところでもあり、悪いところでもある。 あのデータはどこに置いたっけ…? と無くしもの探しをする必要がない。 データは必ず何らかのアプリに使われることで意味を持つ。そうでなければただの1と0のカタマリでしかない。 だから、データがアプリに管理されるというやり方は理に適っている。 その代わり、別のアプリからデータを参照したいとき、複数のアプリで連携したりなどはとても苦手である。ここはAndroidと正反対だ。 iPhoneとiPadのどちらでも動くアプリがあっても、中のデータは同期できないから、例えばiPhoneで進めたゲームをiPadで遊ぼうとしても、また一からやり直しになってしまう。 これはアプリ開発者にとっても起こる問題だ。 ゲームを作っていて、iPadで実機でステージエディットなんかしていて、さてこのデータをMacで見たいなとか、iPhoneに移したいな、というときに困ってしまう。 iPad内のアプリのホームディレクトリ下にエディットデータを保存しているけど、ファイラは無いから見えないし、同期をとってもMacにはコピーされない。どうしよう。 で、方法はいくつかある。 まず1つ。データを全部文字列に変換して、メールか何かで送る。 これは分かりやすい。 でも、バイナリファイルを文字列に変換する機能を作る必要がある。 毎回作るのは大変。 バイナリファイルをそのまま出力してしまえば、どんなファイルでも対応できる。 XCodeから転送したプログラムで実行しているときは、XCodeの標準出力が使える。 この場所は、iPhone,iPadからMacに対してデータを送れる数少ない場所である。 ここを使おう。 つまり、ホームディレクトリ下の全ファイルの中身を、コンソールに16進表示するコードをプログラム中に仕込んでおく。 で、これをバイナリファイルに戻してやれば良い。 これもプログラム中に仕込む必要がある。(iPhone,iPadにファイルを作るには、実機でプログラムを走らせて作成するしかないからね) つまり、iPadからiPhoneにファイルをコピーするとすると、 ファイルの中身をコンソールに出力するプログラムを作る iPadで実行 Mac-XCodeにファイルの中身が出力される この出力をプログラム中に仕込み、ファイル出力するコードを書く iPhoneでプログラム実行 iPhoneにファイル生成 という流れ。 まず、出力する方のコードはこう。
NSDirectoryEnumerator *dirEnum = [fileMan enumeratorAtPath:fullPath]; というのは、fullPath以下の全ファイルを列挙するオブジェクトdirEnumを作成している。 while (file = [dirEnum nextObject]) で次々にファイル名が取得できる。うう〜ん、べんり! これは、親クラスであるNSEnumeratorクラスの機能。 ちなみに、 array = [dirEnum allObjects]; とすると、一度に全部のオブジェクトを取得できる(arrayはNSArray*型)。取得したあとのdirEnumは空っぽになる。 NSDirectoryEnumeratorについて ファイル名の前には'#'を付けて見分けるようにし、 ファイルの中身は1バイトずつ16進2桁で表示。 これをすべてのファイルについて実行。 改行が"\\n\\\n"となっていることについては、あとで説明。 要するに、行末を "\n\"という形にしておきたいのだ。 さて、これを実行すると、コンソールにこんな感じで出力される。
これをプログラム中に仕込む。 要は、const char *変数を作っといて、そこの初期値にコピペするだけのこと。 行末をバックスラッシュにしてコンソールに出力しておいたのは、ここのため。 行をまたいでいても、一続きの文字列になるからね。 で、この長大な文字列をファイルに生成しなおすプログラムがこれ。
まず、文字列を一時ファイルに書き出します。文字列のままだと作業がしにくいので。 ファイルに書き出して、行ごとに読み出すという方法で行きます。 ここが、コンソールに出力するときにわざわざ"\n"を付け足していた理由。 で、ファイル名を探します。目印は'#'でしたね。ファイル名に改行がついてしまわないよう気をつけながら、ファイルを新規作成します。 コンソールに出力していた16進2桁をバイトに直しながらチクチク書き込み。 これを全ファイルなくなるまで続けたらオシマイ。 ※このプログラム、パス以下が階層構造になっている場合には対応していない。 今回はファイルが全部平に置いてあったので、これで十分だった。 今回、fgetsが使いたいがために、C言語のファイルの読み書きを使いました。 ずいぶん久しぶり…。最近は、fopen()でなくて、fopen_s()とか使うんですか?
こんな感じ? PR |
|
トラックバックURL
|