分类: C/C++
2009-07-08 15:04:02
[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。