Palm Programmer's Laboratory
Palm OS Programmer's Companion Volume I/7-9
7-9 ディレクトリの操作
ディレクトリに対する見慣れた操作は全て VFSマネージャによってサポートされています。これらは以下の“共通的な操作”に一覧されています。共通操作の1つ ―― 指定されたディレクトリ内のファイルを全て列挙する操作 ―― は、250ページの“ディレクトリ内のファイルの列挙”で詳細に説明しています。Palm OS以外のデバイスとのデータの透過性を向上させるため、拡張カードのメーカーは各種のファイルタイプに対してデフォルトディレクトリを指定しています。251ページの“ファイルタイプからのデフォルトディレクトリの取得”では、与えられたファイルタイプのデフォルトディレクトリを取得および設定する方法を説明しています。
ディレクトリパス
全てのパスはボリューム相対であり、ボリューム内で絶対です。VFSマネージャには“現在の作業ディレクトリ”という概念がありません。そのため、相対パス名はサポートされません。ディレクトリのセパレータ文字はスラッシュ“/”です。ボリュームのルートディレクトリはパス名“/”で指定されます。
共通的な操作
VFSマネージャはデスクトップや大きなコンピュータシステムに良くある全ての標準的なディレクトリ操作を提供しています。これらの関数はおおむね予想どおりに動作するため、ここではそれぞれの使用についての詳細には触れません。引数や復帰値、および副作用については、Palm OS Programmer's API Reference の個々の関数の説明を参照して下さい。
これらの関数の多くは、ディレクトリだけでなくファイルにも適用することができます。
表 7.3 共通的なディレクトリ操作
関数 | 説明 |
---|---|
VFSDirCreate | ディレクトリを新規に作成します。 |
VFSFileDelete | 指定したパスのディレクトリを削除します。 |
VFSFileRename | ディレクトリをリネームします。 |
VFSFileOpen | ファイルまたはディレクトリをオープンします。 |
VFSFileClose | ファイルまたはディレクトリをクローズします。 |
VFSFileGetAttributes | 開いているディレクトリの属性を取得します。これには、隠しファイル、読取り専用、システム、およびアーカイブの各ビットが含まれます。この属性フィールドを構成するビットの詳細については Palm OS Programmer's API Reference の“ファイルとディレクトリの属性”を参照して下さい。 |
VFSFileSetAttributes | 開いているディレクトリの属性を設定します。これには、隠しファイル、読取り専用、システム、およびアーカイブの各ビットが含まれます。 |
VFSFileGetDate | 開いているファイルの作成日付、変更日付、および最終アクセス日付を取得します。 |
VFSFileSetDate | 開いているファイルの作成日付、変更日付、および最終アクセス日付を設定します。 |
ディレクトリ内のファイルの列挙
ディレクトリ内のファイルを列挙するのは、VFSDirEntryEnumerate 関数があるため簡単です。この関数の使い方を以下に示します。変数 volRefNum および dirPathStr は以下のコードに先立って宣言、および初期化しておく必要があります。
リスト 7.4 ディレクトリ内容の列挙
// Open the directory and iterate through the files in it. // volRefNum must have already been defined. err = VFSFileOpen(volRefNum, "/", vfsModeRead, &dirRef); if(err == errNone) { // Iterate through all the files in the open directory UInt32 fileIterator; FileInfoType fileInfo; FileRef dirRef; Char *fileName = MemPtrNew(256); // should check for err fileInfo.nameP = fileName; // point to local buffer fileInfo.nameBufLen = 256; fileIterator = expIteratorStart; while (fileIterator != expIteratorStop) { // Get the next file err = VFSDirEntryEnumerate(dirRef, &fileIterator, &fileInfo); if(err == errNone) { // Process the file here. } } MemPtrFree(fileName); } else { // handle directory open error here }
while ループによる繰り返しの度に、VFSDirEntryEnumerate 関数は列挙されるファイルの情報を FileInfoType 構造体にセットします。注意が必要なのは、ファイル名が必要な場合には FileInfoType 構造体の領域を確保するだけでは不十分だということです。ファイル名を格納するためのバッファも用意して、そのポインタを FileInfoType 構造体に設定し、さらにバッファ長を設定しなければなりません。FileInfoType にカプセル化されている情報はファイルの属性だけなので、ほとんどのアプリケーションはファイル名を取得する必要があるでしょう。
ファイルタイプからのデフォルトディレクトリの取得
222ページの“標準的なディレクトリ”で説明したとおり、Palm OS 4.0 の拡張機能には MIME タイプやファイル拡張子を特定のディレクトリ名に対応付ける仕組みが含まれています。この仕組みはスロットドライバによって異なります。メモリースティックでは画像ファイルは“/Images”に保管されるかもしれませんが、MMC カードでは“/DCIM”に保存されるかもしれません。VFS マネージャには、独自のデフォルトディレクトリを登録および登録解除する関数とともに、与えられた MIME タイプや拡張子に対応するデフォルトディレクトリを取得するための関数が含まれています。
VFSGetDefaultDirectory 関数はボリューム参照とファイル拡張子または MIME タイプを含む文字列を受け取り、対応するデフォルトディレクトリのフルパスを含む文字列を返します。ファイルタイプを指定するには、“image/jpeg”、“text/ plain”、または“audio/basic”のような MIME のメディアタイプ/サブタイプのペアを指定するか、あるいは“.jpeg”といったファイル拡張子を指定します。他の多くの Palm OS 関数と同じように、返されるパスを格納するためのバッファはあらかじめ確保しておく必要があります。そして、そのバッファを指すポインタとともにバッファ長を渡します。このバッファ長は関数からの復帰時点でパスの実際の長さを示す値に更新されますが、もともとのバッファ長よりも大きな値になることはありません。
与えられたファイルタイプに対して登録されるデフォルトディレクトリは、“ルート”ディレクトリになるように意図されています。もしデフォルトディレクトリに1つ以上のサブディレクトリがあれば、アプリケーションはそれらのサブディレクトリに対しても該当タイプのファイルを検索しなければなりません。
VFSGetDefaultDirectory を使えば特定のファイル拡張子に関連付けられたディレクトリを取得することができます。ただし、あるデフォルトディレクトリに対応付けられているファイル拡張子の一覧を取得する方法はありません。そのため、CardInfo アプリケーションは自身でファイル拡張子のリストを保持しています。この一覧に含まれる拡張子全てに対して VFSGetDefaultDirectory をコールして対応するデフォルトディレクトリのフルパスを取得することで、それぞれのデフォルトディレクトリに対応するファイル拡張子や拡張子に対応するディレクトリを調べます。
新しいデフォルトディレクトリの登録
スロットドライバが既に認識しているデフォルトディレクトリに加えて、与えられたタイプの外部ストレージカード上の特定のディレクトリを関連付けることができます。ほとんどのアプリケーションはこの機能を必要としません。通常、スロットドライバがサポートするファイルとメディアタイプを登録するためにスロットドライバが使用します。しかし、それを必要とするアプリケーションは VFSRegisterDefaultDirectory とその逆である VFSUnregisterDefaultDirectory を使用できます。そのようなアプリケーションは、通常 expMediaType_Any で希望するファイルタイプを登録します。これは全てのメディアタイプに対して機能するワイルドカードです。実際のメディアタイプを指定した登録によって上書きすることもできます。
指定されたファイル/メディアタイプの組み合わせに対するデフォルトディレクトリが既に登録されている場合、アプリケーションは新たな登録をせず、既存の登録内容を使用するべきです。既存の登録内容は、通常削除するべきではありません。
初期化時に登録されるデフォルトディレクトリ
VFS マネージャは expMediaType_Any メディアタイプ化において以下の登録を行ないます。与えられたメディアタイプに対してスロットドライバによるデフォルト登録が存在しない場合、VFSGetDefaultDirectory はこれらの値を返します。
表 7.4 デフォルトの登録
ファイルタイプ | パス |
---|---|
.prc | /PALM/Launcher/ |
.pdb | /PALM/Launcher/ |
.pqa | /PALM/Launcher/ |
application/vnd.palm | /PALM/Launcher/ |
.jpg | /DCIM/ |
.jpeg | /DCIM/ |
image/jpeg | /DCIM/ |
.gif | /DCIM/ |
image/gif | /DCIM/ |
.qt | /DCIM/ |
.mov | /DCIM/ |
video/quicktime | /DCIM/ |
.avi | /DCIM/ |
video/x-msvideo | /DCIM/ |
.mpg | /DCIM/ |
.mpeg | /DCIM/ |
video/mpeg | /DCIM/ |
.mp3 | /AUDIO/ |
.wav | /AUDIO/ |
audio/x-wav | /AUDIO/ |
PalmSource, Inc が提供する SD カードのスロットドライバは以下の登録を行ないます。これは、これらのファイルタイプに適切な仕様があるためです。
表 7.5 SD スロットドライバによる登録ディレクトリ
ファイルタイプ | パス |
---|---|
.jpg | /DCIM/ |
.jpeg | /DCIM/ |
image/jpeg | /DCIM/ |
.qt | /DCIM/ |
.mov | /DCIM/ |
video/quicktime | /DCIM/ |
.avi | /DCIM/ |
video/x-msvideo | /DCIM/ |
Palm の SD スロットドライバによって登録されるディレクトリは全て VFS マネージャによるデフォルト登録と重複していますが、これらは SD の仕様にも明確に含まれているため、SD メディアタイプにおいても登録されます。
メモリースティックのような、異なるメディアタイプをサポートする Palm ハンドヘルドメーカーによって作成されるスロットドライバは、そのメディアの仕様に適したディレクトリをデフォルトとして登録するはずです。場合によってはそれが expMediaType_Any タイプ登録を上書きしたり、あるいはそれまで登録されていなかったファイルタイプを追加することで expMediaType_Any タイプを拡張することもあるかもしれません。
これらの登録はアプリケーション開発者の補助を意図したものですが、それに従わなければならないわけではありません。これらの登録内容を無視することも可能ですが、無視せずに従うことで他のアプリケーションやデバイスとの互換性を向上させることができます。例えば、メディア仕様に適合したデジタルカメラは、撮影した画像をその画像フォーマットとメディアタイプによって登録されたディレクトリ(またはそのサブディレクトリ)に格納するでしょう。そのフォーマットの登録ディレクトリ内を検索することにより、ハンドヘルド上の画像閲覧アプリケーションはカード全体を検索することなく容易に画像を見つけることができます。この登録内容はまた、開発者が特定のファイルタイプに関して異なるパスをハードコーディングすることを防ぎます。そのため、2つの画像閲覧アプリケーションがあったとしても、両方とも同じ場所を参照して同じ画像を見つけ出します。
初期化時にこれらのファイルタイプを登録することにより、HotSync を使用してこれらのファイルを拡張カードに転送することができます。HotSync 処理中に、登録されたタイプのファイルはカード上の特定のディレクトリに直接配置されます。