- - PR -
これまでコーディング規約とクラスの作り方、文字列処理と順を追って説明してきた基本機能シリーズも今回でいよいよ完結となります(注1)。その締めくくりとしてお届けするのは、ファーストシーズンの第8回「クライアントサーバという究極の設計思想」(以下、クラサバ編と略記)で概要をお伝えしたファイル操作関連です。
あるアプリケーションがプロセスの寿命を超えて情報を引き継ごうとするとき、何らかの仕掛けが必要になります(注2)。DB、レジストリ、ネットワークストレージ、データに永続性を持たせるためにいろいろな手段が存在しますが、どこの環境に行ってもまず用意されている基本機能がファイルであるのはご存じのとおりです。Symbian OSでももちろんファイルシステム(というセマンティクスに基づくデータ永続化機能)は用意されており、ほかの環境からの移行者を戸惑わせることはありません。
しかし、クラサバ編でも説明したとおり、Symbian OSのファイルシステムはクライアントサーバというメカニズムの上に構築されています。よって、POSIX的なファイル操作APIとは異なる部分も当然存在します。また、オブジェクト指向に基づくデザインであるため、どのクラスにどのような機能が配置されているか最初にレイアウトを把握しておくことが望ましいのはいうまでもありません(注3)。
今回はファイル操作に関連するクラス構成を紹介しつつ、その中に配置される機能を解説していきます。そして、ゴールにたどり着いたときには「まぁ普通じゃね? 悩まずに使えそうだし」と思っていただこうというのが今回の目標でアリマス。
| 注1:連載自体はGUI編へと続きますので今後ともヨロシクお願いします。 |
| 注2:アプリケーションとはユーザーに提供する応用機能のことであって、そのサービス期間は実現に用いられたプログラムの死活に拘束されるとは限りません。ユーザーの側からすると、例えば電話帳アプリケーションは携帯電話の再起動を超えてずーっと生き続けているように見えています。有限な寿命のプロセスを使って、無限な寿命を持つ(ように見える)アプリケーションをうまく実現するというのが携帯用ソフトウェア設計のキモの1つなのです。この辺りはまた稿をあらためて。 |
| 注3:というか最初にクラスレイアウトを理解しないんだったらOODやOOPLを使う意味はないですよね。どんなモデルで機能を抽象化したのかを理解せずに、適切にAPIを駆使できるはずがないではないですか。前回も触れた“What you get is what you want”を避けるヒントは例えばこの辺りにあります。 |
Hello GUI Worldにおけるファイルアクセス
おなじみのHello GUI Worldプロジェクトには、Wizardが作成したファイル読み込みのコードが含まれています。まずはこれを動かしてみましょう。プロジェクトを実行し、メニューから「ファイルから読み込み」を選択します。

図1 ファイルアクセスコードの実行結果
このとき画面に表示された「Hello, GUI World!」がファイルに格納されている内容です。
上記の処理を行うコードはHelloGUIWorldAppUi.cppのコマンドハンドラに入っています。HelloGUIWorldAppUi.cppを開いてECommand2を検索してください。以下のようなコードが見つかるはずです。
今回は、このコードを含めたHelloGUIWorldAppUi.cppのファイル関連コードが読めるようになることを、具体的な課題として進めていきましょう。
クラス構成
図2のコードにはファイル操作の主要なプレーヤー2人が登場しています(図2内の■黄色囲みの部分)。ファイルの内容の操作を行うクラスであるRFileと、ファイルシステム自体の操作を行うクラスであるRFsです(注4)。
| 注4:クラサバ編の注3でも記したとおり、GUIプログラム環境においてはRFsを自力で作るのではなく、GUIフレームワークから借りてくるのが一般的です。 |
この辺りはクラサバ編でクライアントサーバの事例にかこつけて説明を行いました。しかし、ファイル関連のクラスはこれだけではありません。ファイル操作に関連するクラスはDocBrowserの[C++ API Documentation]→[Symbian OS v9.3 Library for Developers]→[Symbian OS reference]→[C++ component reference]→[Base F32_EKA2]に総覧が収められています(注5)。詳細はDocBrowserをご覧いただくとして、以下、その中から代表的なクラスと役割を示します。
| 注5:[Base F32_EKA2]はヘッダファイルのepoc32\include\f32file.hに相当する部分のドキュメンテーションです。できればヘッダファイルの方も眺めてみてください。 |
# |
クラス名 |
解説 |
1 |
・RFs | ファイルシステムの操作を行う。 ・ディレクトリの作成、削除、名称変更 ・ファイルの削除、名称変更 ・ディレクトリおよびファイルの属性読み書き ・変更の通知 ・ファイルシステムの追加・削除とマウント・アンマウント ・ファイルサーバへの通信路(セッション)を隠蔽(いんぺい)するのがRFsで、処理実体はファイルサーバが担当している、というのはクラサバ編で解説したとおりです。しかし、最初はファイルシステムの操作を行うクラスが用意されているくらいに思っていても別に困りません。 一般的なOSのファイルシステムAPIと異なるのは非同期要求があることです。一般論についてはファーストシーズンの第7回「画期的な『非同期完了待ち』のフレームワーク」をご覧いただくとして、GUI環境での具体的なコードは次回以降のGUI編の中で解説していきます。GUIのイベントモデルと非同期の完了通知モデルの関係を整理したうえで説明しないと、道に迷う人も出てくると思われますので。 |
2 |
・RFile | 個々のファイルの内容に対する操作を行う。 ・Open-Read-Write-Closeのセマンティクスに従い、対象表を開いて内容を操作する ※より簡単にRead/Writeを行うためにTFileTextというサポートクラスも用意されています。一行256文字までのUnicodeファイルであれば、より簡単に読み書きを行うことができます(DocBrowserをドゾ)。 ・構築にはRFsのインスタンスが必要 |
3 |
・RDir ・CDir |
ディレクトリ内の情報の取得を行う。 ・単一のエントリを扱う場合はRDirを、複数エントリを同時に扱いたい場合はCDirを用いる ・構築にはRFsのインスタンスが必要 |
4 |
・TDriveUnit ・TDriveInfo ・TVolumeInfo |
ユニット、ドライブ、ボリューム情報を扱う。 「ユニットはドライブをマウントする機器、ドライブはマウントされるメディア、ボリュームはドライブに作られる最大4つのパーティションを指す」という説明がSDKの中にあります。これはそのとおりなのですが、その関係をこの3つのクラスに当てはめて考えると混乱することになります。3つのクラスの実際の役割は以下のとおりです。 ・ドライブ番号(0-25)とドライブレター(A-Z)の相互変換→TDriveUnit ・ドライブ番号で指定されたドライブの情報の保持→TDriveInfo ・ドライブ番号で指定されたドライブとそこに割り当てられているボリューム情報の一括保持→TVolumeInfo ※TDriveInfo、TVolumeInfoは値を格納するのが役割であり値の取得自体はRFsが行う(つまり、ここでもRFsのインスタンスが必要となる) |
5 |
・TParseBase ・TParse ・TParsePtr ・TParsePtrC |
パス、ファイル名の解析を行う。 ・解析ルーチンを自前で作らないこと(まだそのようなコードを見掛けることがあります。21世紀なのに……) |
6 |
・CFileMan | 高水準ファイル操作を行う。 ・高水準とは複数のファイルに対して一度に操作(Copy、Moveなど)を発行できることを指している ・RFs、RFileとの関係は、Win32APIにおけるファイル操作API(低水準)とSHFileOperation(高水準)の関係と同じ |
7 |
・TFildFile | ファイル検索を行う。 ・検索は、結果を1個ずつ取り出すか(ByPath系)、ディレクトリ内のものをまとめて取り出すか(ByDir系)の2系統が用意されている(RDirとCDirとの違いに相当。ByDir系はCDirを介して複数結果の返却を行っている) ・ワイルドカードを使う場合と、使わない場合で発行するAPIが異なるので注意が必要 ・構築にはRFsのインスタンスが必要 |
必要そうなものは一式そろっていますね。
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)















