Mobile:NEWS 2003年12月12日 03:06 PM 更新

BREW プログラミング入門(8)
ファイルを操作してみよう(1/3)

第6回、第7回と描画に関する話題を詳しく解説してきました。描画については一通り解説しましたので、今回は第6回でも少しだけ取り上げたファイルシステムについて解説したいと思います。

 第6回(連載参照)、第7回(連載参照)と描画に関する話題を詳しく解説してきました。描画については一通り解説しましたので、今回は第6回でも少しだけ取り上げたファイルシステムについて解説したいと思います。

ファイルシステムふたたび

 第6回でも解説しましたが、BREWにはJAVA(J2ME) とは違いPCのようなファイルシステムが存在します。このファイルシステムはディレクトリの作成や階層化などもサポートしており、絶対ファイル名の最大長が64文字(エミュレータ上では256文字)などの制約はありますが便利な構造になっています。以下にBREWのファイルシステムの一例をもう一度取り上げておきます。


BREW のファイルシステムの例

 BREWでは、各アプリは自分のフォルダの中と共有ディレクトリのみアクセスすることができます。つまり、ほかのアプリのディレクトリを操作したり編集したりすることはできません。また、共有ディレクトリが操作できるかどうかは実装依存の部分があります。

 BREWでファイル操作を行う場合には、mifファイルの特権レベルで、ファイル操作または全ての操作を許可する設定がなされていなければなりません。また、共有ディレクトリへのアクセスは、共有ディレクトリの操作または全ての操作を許可する設定がなされていなければなりません。


特権レベルの設定

ファイルシステムを操作してみる

 BREWでディレクトリの操作やファイルの列挙、情報取得を行うには、IFileMgrインタフェースを使用します。また、具体的なファイルの読み書きはIFileインタフェースを使用します。まず、IFileMgrインタフェースを使用したファイルシステムの操作について解説したいと思います。

 IFileMgrインタフェースには以下のようなAPIが存在します。ファイルシステムの操作は、これらのAPIを使用して行います。

関数名解説
IFILEMGR_EnumInitディレクトリやファイルの列挙を行うためにインタフェースを初期化します。
IFILEMGR_EnumNext列挙中の次のディレクトリやファイルの情報を取得します。
IFILEMGR_EnumNextEx列挙中の次のディレクトリやファイルの拡張情報を取得します。
IFILEMGR_GetInfo名前で指定されたディレクトリやファイルの情報を取得します。
IFILEMGR_GetInfoEx名前で指定されたディレクトリやファイルの拡張情報を取得します。
IFILEMGR_MkDirディレクトリを作成します。
IFILEMGR_RmDirディレクトリを削除します。
IFILEMGR_OpenFileファイルを開きます。
IFILEMGR_Removeファイルを削除します。
IFILEMGR_Test指定された名前のディレクトリやファイルが存在するか確認します。
IFILEMGR_Renameディレクトリやファイルの名前を変更します。
IFILEMGR_GetFreeSpaceファイルシステムで使用可能な空きバイト数を取得します。
IFILEMGR_GetLastErrorより詳しいエラー情報を取得します。

※上記表は、頻繁に使用されるAPIしか列挙していません。より詳しい情報はBREW APIリファレンスを参照してください。

ディレクトリを操作してみる

 それでは上記APIを使用して、新しいディレクトリを作成した後、名前を変更してから削除してみましょう。まず、以下にコードを示します。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
// IFileMgr インタフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// ディレクトリの作成
IFILEMGR_MkDir(filemgr,"new_dir");
// 名前の変更
IFILEMGR_Rename(filemgr,"new_dir","temp_dir");
// ディレクトリの破棄
IFILEMGR_RmDir(filemgr,"temp_dir");
// IFileMgr インタフェースの破棄
IFILEMGR_Release(filemgr);

 まず、IShellインタフェースを使用してIFileMgrインタフェースのオブジェクトを作成します。"new_dir"という名前のディレクトリを作成し、"temp_dir"という名前に変更した後、"temp_dir"という名前のディレクトリを削除しています。ここで注意点は、IFILEMGR_MkDir関数は既に同名のディレクトリが存在する場合でも成功したことを示す値を返します。またIFILEMGR_RmDir関数はディレクトリの中身が空の状態でないと正しく削除できません。よって、上記コードを実験する場合は、同名のディレクトリが存在しない環境で行う必要があります。

 次に、深い階層のディレクトリを作成してみましょう。IFILEMGR_MkDir関数は存在しない親ディレクトリを再帰的に作成してはくれませんので、深い階層のディレクトリを作成するには親になる階層を逐一作成しなければなりません。

 以下に3階層のディレクトリを作成するコードを示します。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
// IFileMgr インタフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// 1階層目のディレクトリを作成
IFILEMGR_MkDir(filemgr,"1st_dir");
// 2階層目のディレクトリを作成
IFILEMGR_MkDir(filemgr,"1st_dir/2nd_dir");
// 3階層目のディレクトリを作成
IFILEMGR_MkDir(filemgr,"1st_dir/2nd_dir/3rd_dir");
// IFileMgr インタフェースの破棄
IFILEMGR_Release(filemgr);

上記のように、BREWではディレクトリやファイルのパスは絶対パスで指定します。カレントディレクトリなどの概念は存在しません。

ディレクトリやファイルを再帰的に列挙する方法

 ファイルシステムの操作を行っていると、全てのディレクトリやファイルを再帰的に巡回して列挙したくなることがあります。また、IFILEMGR_RmDir関数は中身が完全に空でないと正常に削除できないため、再帰的な列挙はディレクトリの中身を空にすることにも利用できます。

static void GetInfoRecursive(FilesystemApplet* app,const char* name)
{
  IShell*  shell = app->a.m_pIShell;
  IFileMgr*  filemgr;
  FileInfo  info;
  // IFileMgr インタフェースの作成
  ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
  // 列挙をディレクトリ用に初期化
  IFILEMGR_EnumInit(filemgr,name,TRUE);
  // 次の要素を取得
  while (IFILEMGR_EnumNext(filemgr,&info)) {
    // ディレクトリ名の出力
    DBGPRINTF("Directory found : %s",info.szName);
    // ディレクトリの中を再帰的に巡回
    GetInfoRecursive(app,info.szName);
  }
  // 列挙をファイル用に初期化
  IFILEMGR_EnumInit(filemgr,name,FALSE);
  // 次の要素を取得
  while (IFILEMGR_EnumNext(filemgr,&info)) {
    // ファイル名の出力
    DBGPRINTF("File found : %s",info.szName);
  }
  // IFileMgr インタフェースの破棄
  IFILEMGR_Release(filemgr);
  return;
}
// 呼び出し
GetInfoRecursive(app,"");

 上記コードはディレクトリを再帰的に巡回し、見つかったディレクトリやファイルをデバッグ出力に書き出します。最上位階層は "" で表現され、まず最上位階層から巡回を初めています。上記コードでは、ディレクトリごとにIFileMgrインタフェースを作成しているので少々動作が重いですが、一つのIFileMgrインタフェースを使いまわすとディレクトリごとにIFILEMGR_EnumInit関数が呼び出されるので正確な列挙を行えません。

 一つの解決策として、一つのIFileMgrインタフェースを使いまわして、あらかじめファイルシステムの状態をメモリに記憶しておいて巡回する方法があります。

[堀口淳史, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 1/3 | 次のページ



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!