English
PROGRAMMER'S GUIDEファイルシステムライブラリ
戻る進む
ファイルシステムライブラリ

3.ディレクトリ操作


3.1 初期化

 本ライブラリを使用する前にGFS_Initを実行しなければなりません。GFS_Initは以下の処理を行います。

 (1)初期化
 ライブラリが使用する作業領域の設定と、その初期化を行います。作業領域とディレクトリ情報格納領域は、すべてアプリケーション側で用意する必要があります。
 その領域の大きさは、同時に開くファイルの数によって変化するので、次のマクロで求めます。ここでopen_maxは同時に開くファイルの最大数です。

 GFS_WORK_SIZE(open_max)

 (2)マウント処理
 CD-ROMからルートディレクトリを読み込んで、それをカレントディレクトリに設定します。またCDブロックを初期化し、CDバッファのセクタデータをすべて削除します。ファイルシステムはディレクトリ情報格納領域の先頭アドレスを保持するだけなので、アプリケーションは領域の内容を変更してはなりません。
 次のようにディレクトリ情報管理構造体を初期化してGFS_Initを呼び出します。

#define OPEN_MAX  20                       /* 同時に開くファイルの最大数  */
#define MAX_DIR   10                       /* ディレクトリ情報の最大数   */

Uint32 work[GFS_WORK_SIZE(OPEN_MAX)/4]; /* ライブラリ作業領域      */ GfsDirTbl dirtbl; /* ディレクトリ情報管理構造体  */ GfsDirId dir[MAX_DIR]; /* ディレクトリ情報格納領域   */

GFS_DIRTBL_TYPE(&dirtbl) = GFS_DIR_ID; /* ディレクトリ情報格納領域の型 */ GFS_DIRTBL_NDIR(&dirtbl) = MAX_DIR; /* ディレクトリ情報格納領域の  */ /* 最大要素数          */ GFS_DIRTBL_DIRID(&dirtbl) = dir; /* ディレクトリ情報格納領域の  */ /* アドレス           */ GFS_Init(OPEN_MAX, work, &dirtbl);

 CD-ROMを交換した場合には、GFS_Initを再び呼び出さなくてはなりません。

3.2 ファイル識別子

 本ライブラリでは、アクセスするファイルをファイル識別子で指定するものとします。
 ファイル名でアクセスする場合は、ファイル名をファイル識別子に変換して行います。
 ファイル識別子はカレントディレクトリに対して有効です。

 [例]以下のFILE2.DATをアクセスする場合

図3.1 ファイル識別子によるアクセス

3.3 サブディレクトリ操作

 サブディレクトリにあるファイルをアクセスするには、以下の関数を呼び出すことによってカレントディレクトリ情報を設定する必要があります。

 あらかじめディレクトリ情報を読み込んでおき、ファイルをオープンする時点でのCD-ROMアクセスをなくす、といった使い方ができます。

 (1)ディレクトリ情報の読み込み(GFS_LoadDir)
 サブディレクトリファイルを指定して、ディレクトリ情報を読み込み、保持します。
 この時、ディレクトリ情報保持領域として以下の2種類が選択できます。

(a)GFS_DIR_ID

(b)GFS_DIR_NAME

 (2)カレントディレクトリの設定(GFS_SetDir)
 GFS_LoadDirによって読み込んだディレクトリ情報領域をカレントディレクトリとします。

図3.2 ディレクトリ情報の設定

 サブディレクトリにあるファイルをアクセスするには次の手順を踏まなければなりません。

ディレクトリ情報の読み込み

カレントディレクトリ設定

ファイルのオープン

ファイルに対するアクセス

ファイルのクローズ

 この手順を二つの例によって示します。

 [例]ルートディレクトリ以外のディレクトリにあるファイルのアクセス
 サブディレクトリにあるファイルへのアクセス手順のプログラム例を示します。ここでアクセスしたいファイルがカレントディレクトリのdir_fidで指定されるディレクトリにあるとします。

#define MAX_DIR    10         /* ディレクトリ情報の最大数        */

GfsDirTbl dirtbl;             /* ディレクトリ情報格納領域        */
GfsDirId dirid[MAX_DIR];      /* ディレクトリ情報格納領域        */
Sint32 dir_fid;               /* ディレクトリファイルの識別子が入る   */
Sint32 fid;                   /* アクセスするファイルの識別子が入る   */
GfsHn gfs;                    /* アクセスするファイルのファイルハンドル */

GFS_DIRTBL_TYPE (&dirtbl) = GFS_DIR_ID;
GFS_DIRTBL_NDIR (&dirtbl) = MAX_DIR;
GFS_DIRTBL_DIRID(&dirtbl) = dirid;

GFS_LoadDir(dir_fid, &dirtbl);	/* ディレクトリ情報の読み込み       */

GFS_SetDir(&dirtbl);          	/* カレントディレクトリ設定        */

/* fidにアクセスするファイルの識別子を設定 */
gfs = GFS_Open(fid);
/*
 * ここでファイルアクセスを行う
 */
GFS_Close(gfs);

 [例]異なるディレクトリにある複数のファイルに対する同時アクセス
 異なるディレクトリにあるファイルにアクセスするには、カレントディレクトリを切り替えながら目的のファイルをオープンしなければなりません。
 カレントディレクトリの直下にある二つのサブディレクトリにあるファイルを二つ同時にアクセスする例を示します。アクセスしたいファイルがある二つのサブディレクトリのファイル識別子はそれぞれdir_fid1、dir_fid2で指定されるとします。

#define MAX_DIR1     10    /* dir_fid1 のディレクトリ情報の最大数   */
#define MAX_DIR2     10    /* dir_fid2 のディレクトリ情報の最大数   */

GfsDirTbl curdir;           /* この時点でのカレントディレクトリ       */
GfsDirTbl dirtbl1, dirtbl2; /* ディレクトリ情報管理領域               */
GfsDirId dirid1[MAX_DIR1];  /* ディレクトリ情報格納領域               */
GfsDirId dirid2[MAX_DIR2];  /* ディレクトリ情報格納領域               */
Sint32 dir_fid1, dir_fid2;  /* ディレクトリファイルの識別子が入る     */
Sint32 fid1, fid2;          /* アクセスするファイルの識別子が入る     */
GfsHn gfs1, gfs2;           /* アクセスするファイルのファイルハンドル */

/* カレントディレクトリの dir_fid1 のディレクトリ情報を読み込む       */
GFS_DIRTBL_TYPE (&dirtbl1) = GFS_DIR_ID;
GFS_DIRTBL_NDIR (&dirtbl1) = MAX_DIR;
GFS_DIRTBL_DIRID(&dirtbl1) = dirid1;
GFS_LoadDir(dir_fid1, &dirtbl1);

/* カレントディレクトリの dir_fid2 のディレクトリ情報を読み込む       */
GFS_DIRTBL_TYPE (&dirtbl2) = GFS_DIR_ID;
GFS_DIRTBL_NDIR (&dirtbl2) = MAX_DIR;
GFS_DIRTBL_DIRID(&dirtbl2) = dirid2;
GFS_LoadDir(dir_fid2, &dirtbl2);

/* ディレクトリdir_fid1のファイル、fid1をオープン    */
GFS_SetDir (&dirtbl1);
gfs1 = GFS_Open(fid1);

/* ディレクトリdir_fid2のファイル、fid2をオープン    */
GFS_SetDir (&dirtbl2);
gfs2 = GFS_Open(fid2);
/*
 * ここでファイルアクセスを行う
 */
GFS_Close(gfs1);
GFS_Close(gfs2);

3.4  ファイル名とファイル識別子の相互変換

 カレントディレクトリにファイル名を含んだディレクトリ情報を設定すると、ファイル名とファイル識別子の相互変換機能を利用できます。
 ファイル名を含まないディレクトリ情報をカレントディレクトリに設定しているときに、これらの機能を呼び出すとエラーになります。
 この機能を利用してファイル名でファイルを開く関数の定義例を示します。

[例]  /* ファイル名で指定されたファイルを開く */
     GfsHn OpenByName(Sint8 *fname)
     {
        Sint32 fid = GFS_NameToId(fname);

      if (fid < 0) {       return NULL;       }        return GFS_Open(fid);      }

3.5 CDブロックファイルシステム

 CDブロックファイルシステム(CDブロックに内蔵されたファイルシステム。以下、CDBFSと略する)を利用してディレクトリ管理を行うことができます。
 CDBFSを利用して、初期化、ディレクトリ情報読み込み、カレントディレクトリ設定を行うための処理を以下に示します。

 (1)初期化
 CDBFSの機能を利用するには、ディレクトリ管理構造体へのポインタにNULLを指定してGFS_Initを呼び出さなければなりません。GFS_Initの処理終了後、CDBFSにはルートディレクトリが設定されます。

 (2)ディレクトリ情報読み込み
 サブディレクトリ情報を読み込むには、ディレクトリ管理構造体へのポインタにNULLを指定してGFS_LoadDirを呼び出し、ディレクトリ情報の格納先がCDブロック内であることを指定します。

 (3)カレントディレクトリ設定
 CDブロック内に設定したディレクトリ情報をカレントディレクトリに設定するには、ディレクトリ管理構造体へのポインタにNULLを指定してGFS_SetDirを呼び出します。

 CDBFSを使用する設定を行っても、部分的にディレクトリ管理を本ライブラリで行うことが可能です。その場合にはどのディレクトリ管理機能を利用しているのか、常に注意する必要があります。
 CDBFSの利用による得失を表3.1に示します。

表3.1 CDBFS利用による得失
長所
短所
・ホストメモリの使用量が少ない。
・異なるディレクトリのファイルをアクセ
スするたびにCD-ROMのアクセスが発生
します。
 
・アプリケーションが使用できるCDバッ
ファが1区画減ります。
 
・ファイル名を使用できません。

 ディレクトリ情報読み込みを行う関数GFS_InitとGFS_LoadDirは関数値として、読み込んだディレクトリ情報の個数を返します。CDBFS使用時、その個数はCDBFSが保持しているディレクトリ情報の個数となります。
 CDBFSのカレントディレクトリを設定しているときにファイル名を使用するとエラーとなります。


戻る進む
PROGRAMMER'S GUIDEファイルシステムライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997