高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

テクニカル Q&A

FL 10 - ファイルコントロールブロック(FCB)へのアクセス(1999年10月5日更新)


Q: 開いているファイルのファイルコントロールブロック(FCB)にアクセスするための正しい方法を教えてください。

A: FCB の情報は FSGetForkCBInfo(またはパラメータブロック形式の PBGetForkCBInfoSyncPBGetForkCBInfoAsync か Mac OS 9 以前は PBGetFCBInfoSyncPBGetFCBInfoAsync)を使ってアクセスするのが正しい方法です。直に FCB にアクセスする場合は File System Manager(FSM)の FCB アクセッサを使う場合もあるかもしれません。いずれにしても、FSM が存在する時はファイルコントロールブロックテーブルまたはファイルコントロールブロック (FCB) に直接アクセスすることだけは絶対に避けてください。

Mac OS 8.6 までは、FCB はローメモリの FCBSPtr の指定したところにテーブルの形で保存されていましたが、Mac OS 9 は違います。FCBSPtr を使って FCB にアクセスしているソフトウェアは 68K コードの場合は正常に動作しないか、LMGetFCBSPtrLMSetFCBSPtrLMSetFSFCBLen を呼び出す PowerPC コードの場合はシステムエラー 119(dsMustUseFCBAccessors)を起こします。

警告:

Mac OS 9 では、ファイルの参照番号は FCBSPtr で指定された FCB テーブルへのオフセットではありません。また、FCB の長さも必ずしも FSFCBLen ではありません。

FCB に直接アクセスすることが許可される例外的なケースがあります。つまり、そのコードが対象となるオープンファイルが格納されているボリュームを所有するファイルシステムである場合です。

アプリケーションは常に File Manager 関数を使って開いているファイルの FCB を取得して下さい。該当する File Manager 関数は以下の通りです。

  • ハイレベル関数 FSGetForkCBInfo (Mac OS 9.0 以降)
  • パラメータブロック形式の関数 PBGetForkCBInfoSyncPBGetForkCBInfoAsync(Mac OS 9.0 以降)
  • パラメータブロック形式の関数 PBGetFCBInfoSyncPBGetFCBInfoAsync(Mac OS 9.0 以前)

上記関数が返さない FCB のごく少数のフィールドは、ファイルシステム固有のフィールド、または File Manager が独自に使用するために予約されているフィールドのいずれかです。たとえば、FCB のいくつかのフィールドは、HFS または HFS+ ボリュームにアクセスするために Macintosh ファイルシステムで使用されており、DOS または ProDOS ボリュームにアクセスするために File Exchange ファイルシステムで使用されています。また、AppleShare など、一部のネットワークファイルシステムは PBGetFCBInfo を使って、FCB に保持されている情報を常に更新しているため、FCB に直接アクセスすると古いデータしか取得できないこともあります。

ファイルシステムトラップのパッチやデバッガ(MacsBug の FILE dcmd など)は FCB を直接参照する必要があることは認識しています。役に立つアプリケーションを実行し続け、Apple が将来 File Manager に拡張を加えることを可能にするため、FCB にアクセスする場合はアクセッサ関数を使う必要があります。これらのアクセッサ関数は File System Manager(FSM)の一部として 1994 年に公開され、File System Manager は System 7.5 以降の Mac OS の一部となっています。GestaltgestaltFSAttr セレクタを使用し、gestaltHasFileSystemManager ビットをチェックすることで、FSM の存在を確認することができます。

4つの FCB アクセッサ関数が用意されています。

  1. UTLocateFCB - ファイル番号とボリュームによって FCB を検索します (ファイル名とボリュームによって検索を行うこともできますが、1つのボリュームに複数の同名ファイルが格納されている場合にこの方法は使用できません。)
  2. UTLocateNextFCB - UTLocateFCB を使用した後で、ファイル番号(またはファイル名)とボリュームによって追加の FCB を検索します。
  3. UTIndexFCB - ボリューム上の開いているすべての FCB をインデックス形式でアクセスします。
  4. UTResolveFCB - ファイル参照番号をその FCB にマップします。

これら 4 つの関数はいずれも FCB へのポインタを返し、UTResolveFCB (この関数の場合、ファイル参照番号は入力パラメータです)を除くすべての関数は FCB に対応するファイル参照番号も返します。

この規則は次のように要約できます。

  • ほとんどの場合は File Manager の関数を使って、FCB に関する情報を得ます。
  • FCB を直接アクセスする場合は FSM のアクセッサ関数 UTLocateFCBUTLocateNextFCBUTIndexFCBUTResolveFCB を利用します。
  • FCB テーブルを直接参照できるのは FSM が存在しない場合(System 7.5 以前)のみです。

このトピックの詳細については テクニカルノート 1184: FCBs, Now and Forever もご覧下さい。


-- Jim Luther
Mac OS Release Engineering
-- Revised by Quinn "The Eskimo!"
Worldwide Developer Technical Support

テクニカル Q&A | 目次

To contact us, please use the Contact Us page.