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

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


前のページ

空ではないディレクトリを削除する方法

 次に上記コードを改造して、指定されたディレクトリが空でなくても削除を行う関数を作成してみましょう。

static void RmDirRecursive(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)) {
    // ディレクトリの中を再帰的に巡回
    RmDirRecursive(app,info.szName);
  }
  // 列挙をファイル用に初期化
  IFILEMGR_EnumInit(filemgr,name,FALSE);
  // 次の要素を取得
  while (IFILEMGR_EnumNext(filemgr,&info)) {
    // ファイルの削除
    IFILEMGR_Remove(filemgr,info.szName);
  }
  // ディレクトリの削除
  IFILEMGR_RmDir(filemgr,name);
  // IFileMgr インタフェースの破棄
  IFILEMGR_Release(filemgr);
  return;
}
// 呼び出し
RmDirRecursive(app,"target_dir");

 上記コードのRmDirRecursive関数を使用すると、空でないディレクトリも削除することができます。上記コードでは "target_dir" ディレクトリを削除しています。もしも間違えて "" と指定して呼び出したら大変です。アプリの実体と同じディレクトリ内の全てのファイル(削除可能なものだけ)が削除されてしまいます。実験するときは注意しましょう。

※上記コードをエミュレータ上で動作させる場合、"target_dir" ディレクトリをWindowsのエクスプローラなどで開いていると正常に削除できない場合があります。

ファイルを操作してみる

 ここまではディレクトリの操作の方法を解説してきました。それでは次に、IFileインタフェースを使用したファイルの操作の方法について解説します。

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

関数名解説
IFILE_GetInfoファイルの情報を取得します。
IFILE_GetInfoExファイルの拡張情報を取得します。
IFILE_Readファイルからデータを読み込みます。
IFILE_Readableファイルが読み込み可能になるまで読み込みをペンディングします。
IFILE_Writeファイルへデータを書き出します。
IFILE_CancelIFILE_Readable 関数によって登録されたコールバックをキャンセルします。
IFILE_Seekファイルのアクセス位置を変更します。
IFILE_Truncateファイルを切り詰めます。
IFILE_SetCacheSizeIFile インタフェースの内部バッファリング用のキャッシュサイズを設定します。

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

ファイルのオープンとクローズ

 BREWでファイルの内容を読み書きするためにファイルをオープンするには、IFileMgrインタフェースのIFILEMGR_OpenFile関数を使用します。また、オープンされたファイルをクローズするには、IFileインタフェースのIFILE_Release関数を使用します。IFILEMGR_Close関数やIFILE_Close関数などは存在しません。では、以下に新しいファイル作成した後、オープンしてクローズするコードを示します。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
IFile*  file;
// IFileMgr インタフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// ファイルの新規オープン
file = IFILEMGR_OpenFile(filemgr,"sample.txt",_OFM_CREATE);
// ファイルのクローズ
IFILE_Release(file);
// IFileMgr インタフェースの破棄
IFILEMGR_Release(filemgr);

※上記コードは "sample.txt" という名前のファイルが既に存在する場合は正常にファイルをオープンすることができません。詳細は以下のオープンモードの表を参照してください。

 ここでIFILEMGR_OpenFile関数の第3引数はファイルをオープンするときのモードを表します。BREWで使用できるオープンモードには以下のようなものがあります。

モード解説
_OFM_READファイルを読み込みモードでオープンする。ファイルが存在しない場合は作成しない。
_OFM_READWRITEファイルを読み込み / 書き込みモードでオープンする。ファイルが存在しない場合は作成しない。
_OFM_APPENDファイルを読み込み / 書き込みモードでオープンするが、あらかじめアクセス位置をファイルの末尾に移動させる。ファイルが存在しない場合は作成しない。
_OFM_CREATEファイルを読み込み / 書き込みモードで作成する。既にファイルが存在する場合はファイルがオープンされることはなく、エラーとなる。

 では、ファイルが存在しないときはファイルを作成してオープンし、ファイルが存在するときはファイルをオープンできるように、コードを改良してみましょう。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
IFile*  file;
// IFileMgr インタフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// ファイルのオープン
file = IFILEMGR_OpenFile(filemgr,"sample.txt",_OFM_READWRITE);
// ファイルが存在しなかった場合
if (file == NULL) {
  // ファイルの新規オープン
  file = IFILEMGR_OpenFile(filemgr,"sample.txt",_OFM_CREATE);
}
// ファイルのクローズ
IFILE_Release(file);
// IFileMgr インタフェースの破棄
IFILEMGR_Release(filemgr);

 まず、ファイルを読み書きモードでオープンし、失敗した場合、作成モードでオープンを試みるように修正しました。より、安全なファイル処理を行いたい場合は、IFILEMGR_GetLastError関数を使用して具体的なエラー内容に応じて処理を変更します。

ファイルの情報を取得してみる

 BREW にはディレクトリやファイルの情報を取得するためのAPIがあります。それらのAPIはFileInfo構造体やAEEFileInfoEx構造体に情報を詰め込んで結果を返してくれます。FileInfo構造体はファイルの属性やファイルが作成された日時、ファイルサイズ、ファイル名などが格納されています。また、AEEFileInfoEx構造体はそれらの情報に加えて、ファイルの説明やファイルの所有者などの情報が格納されています。普通FileInfo構造体を使用する事が多いと思いますので、ここではFileInfo構造体を使用したコードを示します。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
IFile*  file;
FileInfo  info;
// IFileMgr インターフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// ファイルのオープン
file = IFILEMGR_OpenFile(filemgr,"sample.txt",_OFM_READ);
// ファイル情報の取得
IFILE_GetInfo(file,&info);
// ファイル情報の出力
DBGPRINTF("name : %s, size : %06d bytes",info.szName,info.dwSize);
// ファイルのクローズ
IFILE_Release(file);
// IFileMgr インターフェースの破棄
IFILEMGR_Release(filemgr);

 いちいちファイルをオープンしなくても情報を取得することができます。

IShell*  shell = app->a.m_pIShell;
IFileMgr*  filemgr;
FileInfo  info;
// IFileMgr インターフェースの作成
ISHELL_CreateInstance(shell,AEECLSID_FILEMGR,(void*)&filemgr);
// ファイル情報の取得
IFILEMGR_GetInfo(filemgr,"sample.txt",&info);
// ファイル情報の出力
DBGPRINTF("name : %s, size : %06d bytes",info.szName,info.dwSize);
// IFileMgr インターフェースの破棄
IFILEMGR_Release(filemgr);

[堀口淳史, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

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



モバイルショップ

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

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