ホーム > デベロッパ > BREW FAQ

BREW FAQ : ファイルシステム

BREW SDK3.1 付属のシミュレータで、リムーバブルディスク (miniSD や MMC) を使用したファイル アクセスをシミュレートできますか ?

リムーバブルディスクを使用したファイル アクセスは、 以下の手順でシミュレートできます。

  1. Windows の [スタート] メニューから、 BREW MIF エディタ ver 3.0 を起動します。
  2. [依存ファイル] タブを選択し、外部クラスモジュールとして AEECLSID_CARD0_ACCESS を追加してください。 外部クラスモジュールの追加方法は、 『BREW SDK 3.0 ユーザードキュメンテーション』の「外部依存クラスの追加」を参照してください。
  3. Windows の [スタート] メニューから、 BREW シミュレータ ver 3.0 を起動します。
  4. [プロパティ] タブを選択し、[MMC1 ディレクトリ] を設定します。 ここで設定したディレクトリがリムーバブルディスクのディレクトリになります。
  5. リムーバブルディスクにアクセスするために、 ファイル名の先頭に AEEFS_CARD0_DIR を設定します。 詳細は、『BREW 3.0 API リファレンス』の「IFileMgrインタフェース」を参照してください。
  6. IFILEMGR_OpenFile を使用し、リムーバブルディスク上のファイルをオープンします。

以下に、リムーバブルディスク上のテキスト ファイルから、 データを読み込むサンプルコードを記載します。

IFileMgr*  fileMgr;
IFile*     file;
char       fileName[32] = {0};
char       buffer[128]  = {0};
int        size = 0;

if (SUCCESS == 
ISHELL_CreateInstance(pMe->m_pIShell, AEECLSID_FILEMGR, (void**)&fileMgr)) {

 // リムーバブルディスクにアクセスするため、
 // ファイル名の先頭に AEEFS_CARD0_DIR を設定します。
 STRCAT(fileName, AEEFS_CARD0_DIR);
 STRCAT(fileName, "test.txt");

 // リムーバブルディスク上のテキスト ファイルをオープンします。
 file = IFILEMGR_OpenFile(fileMgr, fileName, _OFM_READ);

 if (file != NULL) {
  // リムーバブルディスクからファイルを読み込みます。
  size = IFILE_Read(file, buffer, sizeof(buffer) - sizeof(char));

  if (size > 0) {
   // リムーバブルディスクから読み込んだテキスト ファイルの内容を
   // ログに表示します。
   DBGPRINTF("*** read from file : %s ***", buffer);
  }

  // IFile インターフェイスを解放します。
  IFILE_Release(file);
}

 // IFileMgr インターフェイスを解放します。
 IFILEMGR_Release(fileMgr);
}
      

エミュレータで日本語を入力することはできますか?

デバイスファイルを切り替えることで、エミュレータで日本語の入力ができます。デバイスファイルは、BREW SDK 2.1.1 JP に含まれている「Sharp Z-800_Ja_SJIS.qsc」を使用します。
以下の手順で、デバイスファイルの切り替えができます。

  1. エミュレータを起動します。
  2. [ファイル] メニューの [デバイスの読み込み] をクリックします。
  3. [デバイスの選択] ダイアログを表示します。
  4. 「Sharp Z-800_Ja_SJIS.qsc」を選択します。
  5. [デバイスの選択] ダイアログの [開く] をクリックします。

また、デバイスコンフィギュレータを使用してデバイスファイルの内容を日本語に対応させることで、日本語を使用することも可能です。
エミュレータで日本語を使用するには、デバイス属性の言語とフォントにある以下の項目を変更してください。

  • 言語  → "日本語" に変更してください。
  • エンコード  → "S-JIS" に変更してください
  • フォントの種類を変更してください。  → 日本語表示に対応しているフォントに変更してください。 例えば、"MS ゴシック"、"MS 明朝" など。

以下の手順で、デバイスファイルの内容を日本語に対応できます。

  1. デバイスコンフィギュレータを起動します。
  2. [ファイル] メニューの [開く] をクリックします。
  3. [リソースファイルを開く] ダイアログを表示します。
  4. [内容を変更するデバイス ファイル] を選択し、[開く] をクリックします。
  5. [デバイス属性] グループの [詳細] をクリックします。
  6. [デバイス属性] ダイアログ ボックスを表示します。
  7. [言語とフォント] タブを選択します。
  8. [言語] ボックス一覧の [日本語] を選択します。
  9. [エンコード]ボックス一覧の [S-JIS] を選択します。
  10. [アクティブなフォントの種類] グループの [Windowsフォント] を選択します。
  11. [Windowsフォント] グループの [標準] フォントの [設定] をクリックします。
  12. [フォント] ダイアログ ボックスを表示します。
  13. [フォント名] ボックスの一覧の [MS ゴシック] 選択します。
  14. [フォント] ダイアログ ボックスの [OK] をクリックします。
  15. [Windowsフォント] グループの [大きい文字] フォントの [設定] をクリックします。
  16. [フォント] ダイアログ ボックスを表示します。
  17. [フォント名] ボックスの一覧の [MS ゴシック] 選択します。
  18. [フォント] ダイアログ ボックスの [OK] をクリックします。
  19. [デバイス属性] ダイアログ ボックス の [OK] をクリックします。
  20. [ファイル] メニューの [保存] をクリックし、変更内容を保存します。
      

BREW のファイルシステムの特徴を教えてください。

BREW では、パソコンと同じようなファイルシステムが使われています。
BREW 2.x と BREW 3.x 以降で、異なるファイルシステムが用いられています。

BREW 2.x

  • ディレクトリを作成できます。
  • 絶対ファイル名の最大長が 64 文字 (エミュレータでは 255 文字) までという制限があります。
  • アプリケーションのディレクトリ (アプリケーションのモジュール ファイルが存在するディレクトリ) と共有ディレクトリにしかアクセスできません。

他のアプリケーションのディレクトリには、アクセスできません。

BREW でファイルの操作を行う場合は、.mif ファイルの特権レベルでファイルの操作を許可してください。 また、共有ディレクトリに書き込みをする場合は、共有ディレクトリへの書き込みを許可してください。 共有ディレクトリからデータを読み込む場合は、特権レベルを設定する必要はありません。

BREW 3.x 以降

BREW 3.x 以降では、BREW ファイルシステム全体にアクセスすることができます。各ファイルにはアクセス権を設定することができ、他のアプリからのファイルの読み書きを制限することが可能です。

      

ディレクトリを作成するには ?

ディレクトリを作成するには、IFileMgr インターフェイスの IFILEMGR_MkDir 関数を使用します。 IFILEMGR_MkDir 関数は存在しない親ディレクトリを作成してはくれませんので、 多階層のディレクトリを作成するには親になる階層を逐一作成する必要があります。

SophiaFramework では、 SFBFileMgr::MkDir 関数を使用します。

[ BREW API のみを使用したコード ]

IShell*    shell = app->a.m_pIShell;
IFileMgr*  filemgr;

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ディレクトリを作成します。
IFILEMGR_MkDir(filemgr, "new_dir");

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

SFBFileMgrSmp  filemgr;

// SFBFileMgr インスタンスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ディレクトリを作成します。
filemgr->MkDir("new_dir");
      

ディレクトリ名を変更するには ?

ディレクトリ名を変更するには、IFileMgr インターフェイスの IFILEMGR_Rename 関数を使用します。

SophiaFramework では、 SFBFileMgr::Rename 関数を使用します。

[ BREW 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 インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

SFBFileMgrSmp  filemgr;

// SFBFileMgr インスタンスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ディレクトリを作成します。
filemgr->MkDir("new_dir");

// ディレクトリ名を変更します。
filemgr->Rename("new_dir", "temp_dir");
      

ディレクトリを削除するには ?

ディレクトリを削除するには、IFileMgr インターフェイスの IFILEMGR_RmDir 関数を使用します。

SophiaFramework では、 SFBFileMgr::RmDir 関数を使用します。

[ BREW API のみを使用したコード ]

IShell*    shell = app->a.m_pIShell;
IFileMgr*  filemgr;

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ディレクトリを作成します。
IFILEMGR_MkDir(filemgr, "new_dir");

// ディレクトリを削除します。
IFILEMGR_RmDir(filemgr, "new_dir");

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[SophiaFramework を使用したコード]

SFBFileMgrSmp  filemgr;

// SFBFileMgr インスタンスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ディレクトリを作成します。
filemgr->MkDir("new_dir");

// ディレクトリを削除します。
filemgr->RmDir("new_dir");
      

ファイルを作成するには ?

ファイルを作成するには、IFileMgr インターフェイスの IFILEMGR_OpenFile 関数を使用します。

IFILEMGR_OpenFile 関数は以下のように定義されており、 ファイルを作成する場合はオープン モードに _OFM_CREATE を指定します。

IFile* IFILEMGR_OpenFile(
 IFileMgr*    filemgr,   // IFileMgr インターフェイス
 const char*  filename,  // ファイル名
 OpenFile     mode       // オープン モード
);
オープン モード 意味
_OFM_READ ファイルを読み込みモードでオープンします。 ファイルが存在しない場合は、ファイルを作成しません。
_OFM_READWRITE ファイルを読み込み / 書き込みモードでオープンします。 ファイルが存在しない場合は、ファイルを作成しません。
_OFM_APPEND ファイルを読み込み / 書き込みモードでオープンします。 ファイルの末尾からファイル アクセスを行います。 ファイルが存在しない場合は、ファイルを作成しません
_OFM_CREATE ファイルを読み込み / 書き込みモードで作成します。 既にファイルが存在する場合はファイルがオープンされることはなく、エラーとなります。

BREW API には、ファイルをクローズする関数がないため、 ファイルをクローズするには IFile インターフェイスを解放する必要があります。

SophiaFramework では、 SFBFileMgr::OpenFile 関数を使用します。

[ BREW API のみを使用したコード ]

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 インターフェイスを破棄します。
IFILE_Release(file);

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

SFBFileMgrSmp  filemgr;
SFBFileSmp     file;

// SFBFileMgr インスタンスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ファイルを作成します。
file = filemgr->OpenFile("sample.txt", _OFM_CREATE);

// SophiaFramework を使用すると
// ファイルのクローズは自動で行われます。
// もし、手動でクローズしたい場合は、
//
// file.Release();
//
// と記述します。
      

ファイルの情報を取得するには ?

ファイルの情報を取得するには、IFileMgr インターフェイスの IFILEMGR_GetInfo 関数を使用し、 FileInfo 構造体にファイルの情報を取得します。

FileInfo 構造体は、以下のように定義されています。

typedef struct _FileInfo
{
 char        attrib;                    // ファイルの属性
 uint32      dwCreationDate;            // ファイル作成日
 uint32      dwSize;                    // ファイルサイズ
 char        szName[AEE_MAX_FILE_NAME]; // ファイル名
} AEEFileInfo;

SophiaFramework では、 SFBFileMgr::GetInfo 関数を使用します。

[ BREW API のみを使用したコード ]

IShell*    shell = app->a.m_pIShell;
IFileMgr*  filemgr;
FileInfo   info;

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ファイル情報を取得します。
IFILEMGR_GetInfo(filemgr, "sample.txt", &info);

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

SFBFileMgrSmp  filemgr;
FileInfo       info;

// SFBFileMgr インターフェイスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ファイル情報を取得します。
filemgr->GetInfo("sample.txt",&info);
      

ファイルからデータを読み込むには ?

ファイルからデータを読み込むには、IFile インターフェイスの IFILE_Read 関数を使用します。 IFILEMGR_OpenFile 関数のオープン モードに _OFM_READ や _OFM_READWRITE を指定してファイルをオープンし、 IFILE_Read 関数を使用してファイルを読み込みます。このとき、.mif ファイルでファイル アクセスを許可する必要があります。

SophiaFramework では、 SFBFile::Read 関数を使用します。

[ BREW API のみを使用したコード ]

//
// ファイルからデータを読み込みます。
//

IShell*    shell = app->a.m_pIShell;
IFileMgr*  filemgr;
IFile*     file;
char       buffer[128];
int        size;

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ファイルをオープンします。
file = IFILEMGR_OpenFile(filemgr, "sample.txt", _OFM_READ);

// ファイルからデータの読み込みます。
size = IFILE_Read(file, buffer, sizeof(buffer) - 1);

// ファイルをクローズします。
IFILE_Release(file);

// 読み込んだファイルのデータを利用する処理
           ・
           ・
           ・

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

//
// ファイルからデータを読み込みます。
//

SFBFileMgrSmp  filemgr;
SFBFileSmp     file;
AChar          buffer[128];
SInt32         size;

// SFBFileMgr インスタンスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ファイルをオープンします。
file = filemgr->OpenFile("sample.txt", _OFM_READ);

// ファイルからデータの読み込みます。
size = file->Read(buffer, sizeof(buffer) - 1);

// 読み込んだファイルのデータを利用する処理
           ・
           ・
           ・
      

ファイルにデータを書き込むには ?

ファイルにデータを書き込むには、IFile インターフェイスの IFILE_Write 関数を使用します。 IFILEMGR_OpenFile 関数のオープン モードに _OFM_READWRITE や _OFM_CREATE を指定してファイルをオープンし、 IFILE_Write 関数を使用してファイルにデータを書き込みます。このとき、.mif ファイルでファイル アクセスを許可する必要があります。

SophiaFramework では、 SFBFile::Write 関数を使用します。

[ BREW API のみを使用したコード ]

//
// ファイルにデータを書き込みます。
//

IShell*    shell = app->a.m_pishell;
IFileMgr*  filemgr;
IFile*     file;
char       buffer[] = "If you didn't know about the FRAMEWORK for BREW,"
                      " the development of your products will be in the deadline.";

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ファイルをオープンします。
file = ifilemgr_openfile(filemgr, "sample.txt", _ofm_create);

// ファイルへデータを書き込みます。
IFILE_Write(file, buffer, sizeof(buffer) - 1);

// ファイルをクローズします。
IFILE_Release(file);

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

//
// ファイルにデータを書き込みます。
//

SFBFileMgrSmp  filemgr;
SFBFileSmp     file;
AChar          buffer[] = "If you didn't know about the FRAMEWORK for BREW,"
                          " the development of your products will be in the deadline.";

// SFBFileMgr インスタンスを作成します。
filemgr = sfbfilemgr::newinstance();

// ファイルをオープンします。
file = filemgr->openfile("sample.txt", _ofm_create);

// ファイルへデータを書き込みます。
file->Write(buffer, sizeof(buffer) - 1);
      

ファイルのアクセス位置を移動するには ?

ファイルのアクセス位置を移動するには、IFile インターフェイスの IFILE_Seek 関数を使用します。 ファイルのオープン後に、IFILE_Seek 関数を使用してファイルのアクセス位置を変更します。

uint32 IFILE_Seek(
 IFile*        file,         // IFile インターフェイス
 FileSeekType  seekType,     // 移動の起点
 int32         moveDistance  // 移動量
);

ファイルのアクセス位置には、以下の値を指定します。

関数名 [BREW] 処理概要
_SEEK_CURRENT 現在のファイルのアクセス位置を起点とします。
_SEEK_START ファイルの先頭を起点とします。
_SEEK_END ファイルの末尾を起点とします。

SophiaFramework では、 SFBFile::Seek 関数を使用します。

[ BREW API のみを使用したコード ]

//
// ファイルのアクセス位置を移動します。
//

IShell*         shell = app->a.m_pishell;
IFileMgr*       filemgr;
IFile*          file;
char            buffer[128];
int             size;

// IFileMgr インターフェイスを作成します。
ISHELL_CreateInstance(shell, AEECLSID_FILEMGR, (void*)&filemgr);

// ファイルをオープンします。
file = ifilemgr_openfile(filemgr, "sample.txt", _ofm_read);

if (file != null) {
    // ファイルのアクセス位置を変更します。
    IFILE_Seek(file, _SEEK_START, 3);

    // ファイルからデータの読み込みます。
    size = ifile_read(file, buffer, sizeof(buffer) - 1);
    
    if (size > 0) {
        // 読み込んだファイルのデータを利用する処理
               ・
               ・
               ・
    }

    // ファイルをクローズします。
    IFILE_Release(file);
}

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

//
// ファイルのアクセス位置を移動します。
//

SFBFileMgrSmp  filemgr;
SFBFileSmp     file;
AChar          buffer[128];
SInt32         size;

// SFBFileMgr インスタンスを作成します。
filemgr = sfbfilemgr::newinstance();

// ファイルをオープンします。
file = filemgr->openfile("sample.txt", _ofm_read);

if (file != null) {
    // ファイルのアクセス位置を変更します。
    file->Seek(_SEEK_START, 3);

    // ファイルからデータの読み込みます。
    size = file->read(buffer, sizeof(buffer) - 1);

    if (size > 0) {
        // 読み込んだファイルのデータを利用する処理
               ・
               ・
               ・
    }
}
      

ファイルのデータを切り捨てるには ?

ファイル データを切り捨てるには、IFile インターフェイスの IFILE_Truncate 関数を使用します。 ファイルのオープン後に IFILE_Truncate 関数を使用してファイルのデータの切り捨て位置を設定します。

IFILE_Truncate 関数は、以下のように定義されています。

int IFILE_Truncate(
IFile* file,        // IFile インターフェイス
uint32 truncatePos  // 切り捨て位置
);

SophiaFramework では、 SFBFile::Truncate 関数を使用します。

[ BREW API のみを使用したコード ]

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) {
 // ファイル データの切り捨て位置を設定します。
 IFILE_Truncate(file, 3);
 // ファイルをクローズします。
 IFILE_Release(file);
}

// IFileMgr インターフェイスを破棄します。
IFILEMGR_Release(filemgr);

[ SophiaFramework を使用したコード ]

SFBFileMgrSmp  filemgr;
SFBFileSmp     file;

// SFBFileMgr インターフェイスを作成します。
filemgr = SFBFileMgr::NewInstance();

// ファイルをオープンします。
file = filemgr->OpenFile("sample.txt", _OFM_READWRITE);

if (file != null) {
    // ファイル データの切り捨て位置を設定します。
    file->Truncate(3);
}
      

EFS とは ?

EFS とは、Embedded File System (組込みファイルシステム) の略称で、BREW 端末上のファイルシステムのことです。

      

遅延エンコードの場合も ICAMERA_SetMediaData で画像の出力形式を設定しなければいけませんか?

はい。

遅延エンコードに設定されている場合も、ICAMERA_SetMediaData() を設定する必要があります。

これは、ICamera インターフェースがファイルへの出力を前提に設計されているためで、遅延エンコードに設定されている場合は、ICAMERA_RecordSnapshot() が完了した後で ユーザーが ICAMERA_EncodeSnapshot() によってファイルへ出力することが期待されています。そのため、ICAMERA_SetMediaData() が設定されていない場合にはスナップショット モードへの移行を行わない機種すら存在します。

ファイルに出力する必要がない場合には、

pMe->_mediaData.clsData = MMD_FILE_NAME;
pMe->_mediaData.pData = "dummy.jpg";
ICAMERA_SetMediaData(pMe->_camera, &(pMe->_mediaData), "image/jpeg");

のように、適当な値を設定してください。