2006年02月15日

CDirクラスとRFileクラス

CDirクラスとRFileクラス

 CDir クラスはディレクトリを、RFileクラスはファイルを表すクラスとなっています。ディレクトリの操作や、ファイルに対する操作はおのおのCDirクラスやRFileクラスを用いて行います。ここでRFileクラスを用いた簡単なサンプルを見てみましょう(FileTest.zip)。

 このアプリケーションを実行するには、これまでと同様にビルドして、その後に以下のアイコンを探して下さい(画面1)。


 これを実行すると次のような画面が現れます(画面2)。


 [オプション]から[ファイルテスト]を選んでいただきますと、「hello world」という文字をファイルに書き込み、その書き込んだファイルから文字を取り出して出力します(画面3)。


 それでは、このサンプルの重要な部分を見ていきましょう。まずは、ファイルへの書き出しの部分です。

#include
void CFileTestDocument::WriteFile()
{
// ファイルサーバへのセッションを取り出し
RFs& rfs = CCoeEnv::Static()->FsSession();
RFile file ;
TInt rst = file.Create( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
if( rst == KErrAlreadyExists ){
file.Open( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
}
_LIT8( KOutputText , "hello world" );
file.Write(KOutputText, 11 ) ;
file.Close();

}

 ファイルの指定の部分ですが、

"c:\\temp\\test.txt"

この部分で指定しています。筆者の環境で新たにできているはずのtext.txtを探すと、

\Symbian\8.0a\S60_2nd_FP2_J\epoc32\wins\c\temp

にファイルが存在します。エミュレータ上で実行すると、新たにファイルができているはずですので、探してみてください。

補足:筆者の環境では\Symbian\8.0a\S60_2nd_FP2_J\epoc32\winsがエミュレータ上でのファイルシステムのルートになっております。

 ここで、「Series60では、Unicode を基本的に用いる」という話を思い出してください。通常_LITマクロを使用すると、Unicodeで処理がされますが、ここでは明示的に_LIT8マクロを用いて、ASCII文字列を作成しています。

_LIT8( KOutputText , "hello world" );

 ファイルの読み込みも逆の順序で行っています。次にファイル読み込みの関数を見てみましょう。

HBufC8* CFileTestDocument::ReadFile()
{
// ファイルサーバへのセッションを取り出し
RFs& rfs = CCoeEnv::Static()->FsSession();
RFile file ;
HBufC8* buf = HBufC8::NewL(128);
TPtr8 ptr = buf->Des();
TRAPD( error ,
User::LeaveIfError(
file.Open( rfs,
_L("c:\\temp\\test.txt"), EFileRead | EFileStreamText ) ); );
if( error != KErrNone ){
User::Leave(error);
}
TRAP( error ,
User::LeaveIfError( file.Read( ptr, 128) ); );
if( error != KErrNone ){
User::Leave( error );
}
file.Close();
return buf ;
}

 ここでは、ヒープディスクリプタ(HBufC8)を宣言し、そこにファイルから読み取った内容を書き込んでいます。特に、HBubC8からTPtr8を取り出している点に注意してください。ディスクリプタについては後で説明します。

上記サンプルの注意点

このサンプルではRFileクラスを用いてASCII文字列の入出力を行いました。通常Series60では文字列はUnicodeなのですが、 RFileクラスが持っているReadやWriteなどのメンバ関数はバイト単位の入出力しかサポートしておりません。なので、本来はバイナリデータの入出力でこれらの関数を使うことが多いと思いますが、今回はサンプルのわかりやすさから文字列の入出力を行っています。
posted by シンビアン at 16:35| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/13320949

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。