Symbian的文件操作

来源:互联网 发布:微信数据丢失 编辑:程序博客网 时间:2024/05/17 03:30
Symbian提供了文件服务器(RFile)和文件会话(RFs)来支持文件操作。可以像PC一样,Symbian也支持长文件名,但是不支持"."和".."。Symbian提供了一个TFileName类来表示文件名,其定义是:typedef TBuf<KMaxFileName>  TFileName   KMaxFileName=256。因为太耗费资源,建议大家尽量不使用。

    文件服务器提供了对目录和文件的管理功能。 与此相关的库和头文件是:efserv.lib 和 f32file.h。先说目录,CDir类和TEntry类用来表示目录。CDir用于存放当前目录下的文件序列,类似一个数组。TEntry表示CDir里的每一个元素,通过CDir重载的[ ]可以获得TEntry的对象。在使用文件服务器前,要通过RFs的Connect( )建立文件会话。GetDir(const TDesC& aName, TUnit aEntryAttMask, TUnit aEntrySortKey, CDir* aEntryList ) const 获取当前目录的文件序列。根据参数的名字就可以推测出他们表示什么。
    再说文件管理。通过文件服务器可以实现文件的读、写、删、建。在进行这么操作之前,首先要打开文件。通过RFile的Open(RFs aFs, const TDesC& aName, TUnit aFileMode)实现。通过Write( )和Read( )可以实现文件的写和读。这两个函数都具有同步和异步两个版本。RFile的Create( )用于建立新文件,删除文件可以使用RFs的Delete( )。具体可以参考SDK Help。在使用完RFile和RFs之后应该Close( ),这个不能忘记。

    在文件管理中有两个很重要的东西——流和存储。
    流的概念就不介绍了,相信大家都很熟悉。Symbian里封装了两个流:RWriteStream是输出流的基类,RReadStream是输入流的基类。在此基础上派生出了文件输出/输入流:RFileWriteStream和RFileReadStream。在实例化文件输出流之后,调用Replace( )建立输出流(假定要写入的文件不存在),然后PushL( ),将此输出流压入清除栈。完成之后就可以向流写数据了。写完之后调用CommitL( )提交输出流的数据。之后调用RFileWriteStream的Pop( )和Release( ),这两句也等价于CleanupStack::PopAndDestory( )。具体作用就不说了。通过流向文件写数据的过程就是这样。通过流从文件读取数据的过程和写是差不多的。在向HBufC写数据的时候,可以通过HBufC的NewL(aStream, KMaxTInt )重载版本建立堆描述符。
    Symbian的约定要求为任何可以外部化为流的对象提供一个可访问的公有的 ExternalozeL( ) 函数。这个函数以一个输出流的引用作为参数,其实就是将向流写数据的过程集中封装起来。同理,可以提供一个InternalizeL(  )来读取数据。

    存储是多个流的集合。两个基于文件的存储是CDirectFileStore和CPermanentFileStore。后者允许写入后进行修改,而前者不行。在这里有一个Symbian特有的概念:流字典(stream dictionary)。它仅仅是另一个流,只不过它保存的是其他流ID和对应流UID之间的映射。可以像查字典一样,从流字典里找出需要的流。
    使用存储的大致方法是这样的:
void CreateDirectFileStoreL( RFs& aFs, TDesC& aFileName, TUid aAppUid )
{
    CFileStore* store = CDirectFileStore::ReplaceLC( aFs, aFileName, EFileWrite );              //创建Store
    store->SetTypeL( TUidType( KDirectFilestoreLayoutUid, KUidAppDllDoc, aAppUid ) );    //设置类型
    CStreamDictionary* dictionary = CStreamDictionary::NewLC( );                                            //建立流字典

    RStoreWriteStream stream;                                //写入流
    TStreamId id = stream.CreateLC( *store );      //获取流ID
    TInt16 i = 0x1234;
    stream<<i;
    stream.CommitL( );
    CleanupStack::PopAndDestory( );                     //写入

    dictionary->AssignL( aAppUid, id );                 //在流字典中关联流ID

    RStoreWriteStream rootstream;
    TStreamId rootId = rootstream.CreateLC( *store );
    rootstream<<*dictionary;
    rootstream.CommitL( );
    CleanupStack::PopAndDestory( );                   //根流

    store->SetRoot( rootId );                                    //设置根流ID
    store->CommitL( );

    CleanupStack::PopAndDestory( );                  //存储
}

    从存储中读取数据的方法就是将以上的过程反向:
void ReadDirectFileStoreL( RFs& aFs, TDesC& aFileName, TUid aAppUid )
{
    CFileStore* store = CDirectFileStore::OpenLC( aFs, aFileName, EFileRead );    //建立存储

    CStreamDictionary* dictionary = CStreamDictionary::NewLC( );                             //建立流字典

    RStoreReadStream rootstream;                                     //根流
    rootstream.OpenLC( *store, store->Root( ) );              //打开根流
    rootstream>>*dictionary;                                                  //写入流字典
    CleanupStack::PopAndDestory( );

    TStreamId id = dictionary->At( aAppUid );                    //建立映射

    CleanupStack::PopAndDestory( );

    RStoreReadStream stream;
    stream.OpenLC( *store, id );
    TInt16  j;
    stream>>j;                                                                         //读取数据

    CleanupStack::PopAndDestory( );
    CleanupStack::PopAndDestory( );
}

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 税收分类编码不可用怎么办 斗鱼鱼翅充错了怎么办 苹果指纹摔坏了怎么办 小米5指纹坏了怎么办 苹果5s指纹失灵怎么办 学生赌博输了3万怎么办 电脑录屏没有声音怎么办 别人说你没有他美怎么办 没有你我怎么办歌词是什么意思 要是没有他我怎么办啊歌词 用喀秋莎保存的视频黑屏怎么办 电脑杀毒之后开不了机怎么办 夫妻离婚分房分车怎么办 请的护身符丢了怎么办 老车轻微烧机油怎么办 电脑下软件变卡怎么办 机械表日历偏了怎么办 子宫内膜异位痛经怎么办 凉着了坏肚子怎么办 昆虫叮咬后疼痛起水泡怎么办 每次来月经都痛经怎么办 人左肩的灯灭了怎么办 香港超过7天了怎么办? 手机拍完照图像是倒的怎么办 地下城金币邮寄卡了怎么办 wow7.3打团本卡怎么办 上古卷轴5出bug怎么办 苹果手机打游戏太卡怎么办 梦幻将军令换了怎么办 手机丢了将军令怎么办 大军之印放弃了怎么办 联想一体机进入界面就死机怎么办 nmd袜子鞋露脚趾怎么办 生意不顺意志崩溃了怎么办 笔记本突然卡住不动了怎么办 指定货代费用高怎么办 空运舱单上的收货人错了怎么办? 被诚信贷骗了怎么办 原户主不迁户口怎么办 二手房原房主没迁走怎么办 办退工没有就失业证怎么办