Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/7-7

← 6 節に戻る ↑7 章トップへ 8 節に進む →


7-7 ボリュームの操作

 
拡張カードがファイルシステムをサポートしていれば、VFSマネージャの標準的なボリューム操作を利用することができます。どのボリュームがマウントされていて利用可能かを調べるには、VFSVolumeEnumerate 関数を使用します。この関数は、“マウントされたボリュームのチェック”で示した使い方により、後続するボリューム操作で使用するボリューム参照番号を返します。

ユーザーがマウント可能なボリュームを含むカードをスロットに挿入すると、VFSマネージャはボリュームを自動的にマウントしようとします(現在の実装ではスロットあたり1ボリュームのみサポートされています)。稀に、ボリュームをダイレクトにマウントしなければならない場合があります。別のファイルシステムを使ったボリュームのマウントを試みることが可能ですが、それはおそらくハンドヘルドに新しいファイルシステムのドライバをインストールした後にすべきでしょう。ボリュームを明示的にマウントまたはアンマウントするには、VFSVolumeMount 関数とVFSVolumeUnmount 関数を使用します。ボリュームをマウントする際、ファイルシステムを明示的に指定することもできますし、VFSマネージャに適切なファイルシステムを選択するように要求することもできます。利用可能なファイルシステムのいずれでもボリュームをマウントできなかった場合、VFSマネージャはそのスロットに適していると判断されるファイルシステムでボリュームをフォーマットしてからマウントしようとします。ボリュームを明示的にマウントする際に指定すべき VFSVolumeMount 関数の厳密な引数については、“Palm OS Programmer's API Reference” の説明を参照して下さい。

ボリュームをフォーマットするには、VFSVolumeFormat 関数を使用します。この関数は拡張カードのファイルシステムを変更する目的でも使用できます。フォーマットの際、使用するファイルシステムを明示的に指示できます。カードがフォーマットされると、VFSマネージャは自動的にマウントを行ないます。新しいボリューム参照番号は VFSVolumeFormat 関数から返されます。

VFSVolumeGetLabel 関数と VFSVolumeSetLabel 関数はボリュームラベルの取得と設定をそれぞれ行ないます。ファイルシステムは文字列の正当性をチェックするため、任意の値のボリュームラベルへの設定を試すことができます。指定された名前をファイルシステムがネイティブにサポートしない場合、VFSマネージャは長いファイル名をサポートするために /VOLUME.NAM というファイルを作成します(詳細は“ボリュームの命名”を参照して下さい)。あるいは、ファイルシステムが指定された文字列をサポートしなければエラーが返されます。

ボリュームに関する付加的な情報は、VFSVolumeSize や VFSVolumeInfo を使用すれば取得できます。名前が示すとおり、VFSVolumeSize はボリュームのサイズ情報を返します。具体的には、この関数はボリューム全体のサイズと使用されているサイズをともにバイト単位で返します。VFSVolumeInfo はボリュームに関する様々な情報を返します。これには以下のものが含まれます。

  • ボリュームが隠し属性かどうか。
  • ボリュームが読み取り専用かどうか。
  • ボリュームがスロットドライバによってサポートされているかどうか、あるいはPalm OSエミュレータによってシミュレートされているかどうか。
  • 基になるファイルシステムのタイプとクリエータ
  • ボリュームが関連付けられているスロット、およびスロットをコントロールしているスロットドライバの参照番号
  • SD、コンパクトフラッシュ、メモリースティックなど、ボリュームが配置されているメディアの種類

上記の全ての情報は、VolumeInfoType 構造体にカプセル化されて返されます。ボリュームの隠し属性と読み取り専用属性についてはさらにこの構造体の同じフィールドに格納されます。このフィールドを構成するビットについては Palm OS Programmer's API Reference の “Volume Attributes” を参照して下さい。

 

隠しボリューム

ボリューム属性には、“隠し属性”のビットである vfsVolumeAttrHidden が含まれています。これはカード上のそのボリュームが可視状態か、それとも隠されているかを示しています。隠しボリュームは通常ユーザーが直接利用することができないことを意味します。ランチャやカード情報アプリケーションはともに隠しボリュームを無視します。

ボリュームを隠すには、単純に HIDDEN.VOL という名前のファイルを /PALM ディレクトリの直下に作成します。VFSVolumeInfo 関数はこのファイルを探し、見つかればボリュームの他の属性とともに vfsVolumeAttrHidden を設定して返します。

 

ボリュームとスロットの対応付け

多くのアプリケーションは ExpCardInfo 関数が提供する拡張カードの詳細情報を知る必要はありません。大抵の場合、VFSVolumeInfo が提供する情報で十分です。しかし、アプリケーションによってはボリュームの情報だけでは不十分な場合があります。例えば、メーカー名やカードの種類が重要な場合もあります。

VFSVolumeInfo が返す VolumeInfoType 構造体には、slotRefNum フィールドがあります。これは ExpCardInfo に渡すことができます。これにより、特定のボリュームが配置されているカードに関する情報を取得することができます。

スロットドライバは現状、スロットあたり1ボリュームしかサポートしていませんが、与えられたスロット参照番号に対応するボリューム情報の取得はそれほど単純ではありません。なぜなら、スロット参照番号を与えてボリューム参照番号を返すような関数がないからです。しかし、マウントされたボリュームを反復しつつボリュームのスロット参照番号をチェックすることができます。これはカード情報アプリケーションが使用しているテクニックです。

 

ボリュームの命名

異なるファイルシステムライブラリは異なる最大長のボリューム名と異なる使用可能文字をサポートします。ファイルシステムライブラリは指定されたボリューム名が正当かどうかを検証する責任を持ち、不正な名前に対してエラーを返します。Palm OS 開発者の立場から見ると、ボリューム名は最大で 255 文字までで、印字可能な文字を使用することができます。

ボリューム名をファイルシステムが許容できるフォーマットに変換するのはファイルシステムライブラリの役目です。例えば、ファイル名に 8.3 命名規則を使用するファイルシステムで長いボリューム名を変換すると、非スペース文字で有効な最初の 11 文字が使用されます。この場合に有効な文字とは、 A-Z, 0-9, $, %, ‘, -, _, @, ~, ‘, !, (, ), ^, #, および & です。

ベースとなるファイルシステムが長いボリューム名をサポートしない場合、VFSVolumeSetLabel は /VOLUME.NAM というファイルを作成して長いボリューム名を保存しようとします。このファイルには以下のデータが含まれています。

フィールド 説明
Char cookie[4] このファイルを識別するための 4 バイトのクッキー。このクッキーの値は vfsVolumeNameFileCook です。
UInt16 cacheLen キャッシュされたファイルシステムレベルのボリュームラベルのバイト長で、ビッグエンディアンで保存されています。
Char cacheLabel[cacheLen] Unicode UCS-2 フォーマットの文字列で、ファイルシステムレイヤーに保存されているボリュームラベルを格納しています。これをファイルシステムのボリュームラベルと比較し、/VOLUME.NAM ファイルをサポートしていないデバイス上でユーザーがボリュームラベルを変更したかどうかを確認します。このイベントでは、ファイルシステムのボリュームラベルが使用され、/VOLUME.NAM の内容は無視されます。
UInt16 length ボリュームラベルのバイト長で、ビッグエンディアンで保存されています。
Char label[length] Unicode UCS-2 フォーマットの文字列で、長いボリュームラベルを格納しています。

 


← 6 節に戻る ↑7 章トップへ 8 節に進む →