Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/6-3
6-3 ファイルストリーミングの API
Palm OS 3.0 以降のファイルストリーミング関数を使えば、大きなデータブロックを操作することができます。ファイルストリームは任意の大きさにできます ── メモリマネージャのアロケートにおける 64KB の制限はありません。ファイルストリームは永続的なデータストレージに使用できます。Palm OS 3.0 では、Palm OS データベースを基礎として実装されています。読み取り、書込み、特定位置へのシーク、切り捨て、その他デスクトップスタイルのファイルに対してできることは全て行なえます。
バックアップ/レストアの他、Palm OS はダイレクトな HotSync もファイルストリームに対してはサポートしませんし、現時点では予定もされていません。
ファイルストリームに対するダブルバッファリングは、特定のアプリケーションには不適切で、パフォーマンス上の負荷となります。レコード集約的なアプリケーションはデータマネージャを使用した方がパフォーマンス的に有利になる傾向があります。
ファイルストリーミング API の使用
ファイルストリーミング API は、C 言語の <stdio.h> のインターフェースから派生しています。<stdio.h> のインターフェースを解説している本ならどれでも、Palm OS のファイルストリーミング API の基本的な概念の良い手引になります。このセクションでは、もっとも頻繁に使用されるファイルストリーミング関数の簡単な概要を示すに留めます。
FileOpen 関数はファイルを開き、FileRead 関数は開いたファイルからデータを読み取ります。FileRead と FileWrite のセマンティクスは <stdio.h> で対応する fread および fwrite と同じです。その他の <stdio.h> ルーチンにも同様に、ファイルストリーミング API に対応する関数があります。
例を示します。
theStream = FileOpen(cardId,"KillerAppDataFile", 'KILR', 'KILD', fileModeReadOnly, &err);
デスクトップと同様に、ファイル名は一意な要素です。クリエータIDとファイルタイプは情報として渡すものであり、オープンするファイルがそのクリエータIDとタイプを有していることをアプリケーションが要求するためのものです。
通常、FileOpen 関数は、指定されたタイプとクリエータにマッチしないファイルを開いたり既存のストリームをリプレースしようとした場合にエラーを返します。このエラーを抑止するには、FileOpen 関数の openMode パラメータにフラグとして fileModeAnyTypeCreator を渡します。
データを読み込むには、以下に示すように FileRead 関数を使います。
FileRead(theStream, &buf, objSize, numObjs, &err);
データの読み込みの際にストリームデータを格納するのに使われたメモリを開放するために、FileControl 関数を使用してストリームを破壊的読み取りモードに変更することができます。このモードは一時的なデータの操作に適しています。例えば、破壊的読み取りモードは、ストリーム全体をコピーする十分なメモリがない状況で、大きなデータストリーム上のオブジェクトをデータベースに追加するのに最適です。FileControl 関数の op パラメータに fileOpDestructiveReadMode を渡すことでストリームを破壊的読み取りモードに変更することができます。
FileDmRead 関数を使うことで、データを Palm OS データベースに即座に追加するために直接データマネージャチャンクに読み取ることができます。