Symbian OSアプリ開発の手引き

Symbian OSアプリ開発の手引き(6)

Symbian OSのファイル操作を悩まずに使いこなす

大久保 潤 管理工学研究所 2008/10/8

Symbian OSの全体像を概観した「Symbian OS開発の勘所」の続編となる今回は、“実際にどのようなプログラムを書くのか?”をテーマにSymbian OS向けのアプリケーション開発における心得を分かりやすく伝授する。(編集部)

- 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を検索してください。以下のようなコードが見つかるはずです。

図2 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 ファイル操作用主要クラス
#
クラス名
解説
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のインスタンスが必要

 必要そうなものは一式そろっていますね。

  • 連載バックナンバー
  • 全記事インデックス
  • 組み込み開発トップ
  • MONOistトップ

スキルアップ/キャリアアップ(JOB@IT)

スポンサーからのお知らせ

- PR -
@IT Sepcial

震災関連・復興支援情報

震災関連・復興支援情報
@IT MONOist/EE Times Japan/環境メディアの製造業技術者向け3メディアを中心に、震災関連/復興支援情報を集めました

次世代エンベデッドコーナー

次世代エンベデッド
“次世代”の組み込み機器を開発するエンジニアを支援するコーナー。新潮流・新技術をインタビューやコラム、解説記事で分かりやすく紹介!

Windows Embeddedコーナー

Windows Embedded
Windows Embedded専門コーナー。Windows Embedded StandardやWindows Embedded CEをはじめとする「Windows Embedded」ファミリの最新動向や技術情報をお届けします!!

Androidコーナー

Android
Android専門コーナー。組み込みデバイスへの適用からアプリケーション開発、イベントレポート、ニュースなどAndroidに関するさまざまな技術情報がここに集結!!

@IT MONOist 求人情報

- PR -