Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3472798
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: C/C++

2009-07-08 15:04:02

先看一下典型的ini文件格式:

[section1] 
key1=value1
key2=value2
[section2]

说到底,ini就是一文本文件,再不济也可以自己写一个类来封装文本操作实现ini的读取和保存,区别只是效率问题。
对于ini配置文件,Symbian提供了自己的一套方式(我在说这句话的时候,貌似言外之意Symbian的这套方式和Windows不同,事实上我并不知道Windows的实现方式,或许大同小异也说不准 :)),Symbian的单个ini文件没有多section的概念,一个ini文件代表一个CDictionaryFileStore对象,对应一个UID,里面的多个key都有唯一的UID相对应。
下面详细描述一下:
1.如何获取CDictionaryFileStore实例
如果是exe,需要使用CDictionaryFileStore::OpenLC方式创建
CDictionaryFileStore* dfs = CDictionaryFileStore::OpenLC(fs,KConfigFilePath,TUid::Uid(SMSCONFIGFILE_UID));
其中fs是一个RFs句柄,KConfigFilePath是你的ini文件的fullpath,SMSCONFIGFILE_UID你可以自己指定一个数字,用来唯一标识你的ini文件
如果是app,图形框架已经帮你代劳了一半
CDictionaryFileStore* store = m_Doc->Application()->OpenIniFileLC(env->FsSession());
m_Doc是你程序的Document实例指针,env->FsSession()是一个RFs句柄,你可以用EikonEnv提供的,也可以自己构造一个RFs。
为了让OpenIniFileLC工作正常,你还需要覆盖
CDictionaryStore* CXXXApp::OpenIniFileLC(RFs& aFs) const
{
  __UHEAP_MARK;
  return CEikApplication::OpenIniFileLC(aFs);
  __UHEAP_MARKEND;
}
这样app框架就会创建c:\private\yourAppUID\yourAppName.ini文件用来存放你的本地配置了。

2.如何读
 RDictionaryReadStream reader;
 // server autorun
 if(dfs->IsPresentL(TUid::Uid(SERVERAUTORUN_UID)))
 {
  reader.OpenLC(*dfs,TUid::Uid(SERVERAUTORUN_UID));
  CSMSConfigReader::gServerAutorun = (reader.ReadInt32L()==1);
  CleanupStack::PopAndDestroy(); //reader
 }
通过IsPresentL检测是否某个key存在,存在则调用RDictionaryReadStream的ReadInt32L等一些方法读取数字;
如果是描述符,则可以用RDictionaryReadStream >> aBuf进行读取,这个aBuf可以是8bit也可以是16bit的;
如果是其他RDictionaryReadStream支持的对象,比如CFbsBitmap ,可以用CFbsBitmap::InternalizeL(RWriteStream &)方法从流中提取数据。

3.如何写
 RDictionaryWriteStream writer;
 //server autorun
 writer.AssignLC(*dfs,TUid::Uid(SERVERAUTORUN_UID));
 if(CSMSConfigReader::gServerAutorun)
  writer.WriteInt32L(1);
 else
  writer.WriteInt32L(0);
 writer.CommitL();
 CleanupStack::PopAndDestroy(); //writer
 dfs->CommitL();
用RDictionaryWriteStream::AssignLC()方法将流和某个key绑定,调用WriteInt32L等一系列方法写入数字;
或者用RDictionaryWriteStream << 操作符写入描述符;
或者用CFbsBitmap等的ExternalizeL()方法写入数据。
最后记得要调用CDictionaryFileStore::CommitL()方法提交,否则虽然数据写入到了ini文件,但是这些数据不被CDictionaryFileStore识别,当然也无法读取了。

小技巧:
有时候想在ini中存放动态长度的文本(描述符),读取的时候如果存放到一个HBufC中,是不是会为这个HBufC的长度烦恼呢?确实,过大了浪费,过小怕出错。这时可以考虑在ini中增加一组key/value对来存放长度,这招是不是很绝呢,哈哈哈哈哈,唯一费事的就是写入文本的时候要同时更新这组key/value。

阅读(383) | 评论(0) | 转发(0) |
0

上一篇:如何得到幸福

下一篇:Symbian Ini 简介

给主人留下些什么吧!~~