BREW のファイルシステムとは?
BREW のファイルシステムは、Windows や UNIX などの OS と同じようなディレクトリ構造を持っています。
BREW でのファイル処理の概略は次のようになります。
- IFileMgr インターフェースのインスタンスを生成します。
- IFILEMGR_OpenFile() 関数を使ってファイルをオープンします。
- IFILE_Read() 関数 または IFILE_Write() 関数 を使ってファイル入出力をします。
- IFILE_Release() 関数を使ってファイルをクローズします。
- IFILEMGR_Release() 関数を使って IFileMgr インターフェースのインスタンスを解放します。
BREW ファイルシステムの機能と制限事項は以下の通りです。
- ディレクトリを作成できます。
- 絶対ファイル名の最大長は 64 文字までです。エミュレーターでは 255 文字まで可能なので注意が必要です。
- エミュレーターでは、パス名に日本語が含まれていると処理されません。
- ファイル名に含まれる英文字の大文字と小文字は区別されません。
- アプレットディレクトリ (アプリの mod ファイルが置かれたディレクトリ) と共有ディレクトリにしかアクセスできません。
- 他のアプリのディレクトリには、アクセスできません。
- MIF ファイルに、アプリで作成可能な最大ファイル数と書き込み可能な最大バイト数を設定できます。
※ 1. MIF ファイルの特権レベルの設定では「ファイル」を選択します。共有ディレクトリに書き込みをする場合は、「共有ディレクトリへの書き込みアクセス」を選択します。 共有ディレクトリからのデータを読み込みだけの場合は、特権レベルの設定は不要です。
※ 2. 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_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);
}
リムーバブルディスクへのファイルアクセスをエミュレートするには …?
BREW 3.1 から miniSD や MMCなどのリムーバブルディスクへアクセスできるようになりました。
リムーバブルディスクを使用したファイルアクセスは、 以下の手順でエミュレートできます。
- Windows の [スタート] メニューから、 BREW MIF エディタ ver 3.0 を起動します。
- [依存ファイル] タブを選択し、外部クラスモジュールとして AEECLSID_CARD0_ACCESS を追加してください。 外部クラスモジュールの追加方法は、 『BREW SDK 3.0 ユーザードキュメンテーション』の「外部依存クラスの追加」を参照してください。
- Windows の [スタート] メニューから、 BREW シミュレータ ver 3.0 を起動します。
- [プロパティ] タブを選択し、[MMC1 ディレクトリ] を設定します。 ここで設定したディレクトリがリムーバブルディスクのディレクトリになります。
- リムーバブルディスクにアクセスするために、 ファイル名の先頭に AEEFS_CARD0_DIR を設定します。 詳細は、『BREW 3.0 API リファレンス』の「IFileMgrインタフェース」を参照してください。
- IFILEMGR_OpenFile を使用し、リムーバブルディスク上のファイルをオープンします。
以下に、リムーバブルディスク上のテキスト ファイルから、 データを読み込むサンプルコードを記載します。
続きを読む »
遅延エンコードでも画像の出力形式の設定が必要ですか?
遅延エンコードに設定されている場合も、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");
のように、適当な値を設定してください。
ファイル名に大文字小文字が混じっていても大丈夫ですか?
BREW SDK v3.1 では、ファイル名がすべて小文字である必要があります。
アプリケーションクラス名などは大文字が混じっていても、警告が出るだけで、BREW 3.1 上で問題なく動作することを確認しております。
リソースファイル名などに関しては、大文字が混じっていると動作しない場合があるので、すべて小文字にすることを推奨します。
BREW 3.1 用プロジェクトを新しく作成する場合も、小文字にすることを推奨します。