每个Symbian OS 应用程序都可以有一个.ini文件,该文件通常用于保存应用程序的初始化设置。
INI文件可以被当做普通的文件处理,但是为了方便使用,Symbian OS 应用程序框架中的应用程序类CEikApplication为访问INI文件提供了内置的支持。该类中的OpenIniFileLC()函数可以打开默认的INI文件,定义如下:
CDictionaryStore* OpenIniFileLC(RFs& aFs) Const;
如果应用程序的名称是appname,默认的INI文件的路径时c:/system/apps/appname/appname.ini。
OpenIniFileLC()函数的返回值是一个指向CDictionaryStory对象的指针,可以将该指针理解成INI文件的指针。Symbian OS 的文件访问机制中有一个存储的概念,可以简单的理解成流的集合,它用于处理一些更复杂的文件访问需求。CDictionaryStory类是存储类中比较简单的一种,该类可以包含一个或多个流,每个流靠一个UID和一个流ID标识。
需要重写这个函数,否则会报,功能不支持错误!
CDictionaryStore* CDolphinRadioS3Application::OpenIniFileLC(RFs& aFs) const
{
return CEikApplication::OpenIniFileLC(aFs);
}
选取UID,常用的做法是枚举定义
enum TIniFileData
{
EData1 = 1;
EData2
};
选用UID时,使用TUid::Uid(EData1)就可以获得一个UID值。向INI文件中写数据时,使用的是RDictionaryWriteStream类,该类是RWriteStream类的一个派生类。其中AssignLC()函数可以通过INI文件的指针和一个UID值获得INI文件中的一个流,向这个流中写数据时的操作与使用RWriteSteam类时一致。如果需要向INI文件写入多个数据项,可以为每个数据项建立一个流,代码如下:
void CMyAppUi::StoreL()
{
//调用Application类的OpenIniFileLC()函数获得INI文件的指针
CDictionaryStore* iniFile = Application()->OpenIniFileLC(iCoeEnv->FsSession());
//向INI文件写入一个TInt64类型的整数
RDictionaryWriteStream writeStream;
//使用AssignLC()函数,在INI文件中打开或新建一个Stream
writeStream.AssignLC(*iniFile,TUid::Uid(EData1));
TInt64 integer(1234);
//使用操作符<<写入数据
writeStream << integer;
writeStream.CommitL();
//向INI文件中写入一个字符串
RDictionary WriteStream writeStream2;
//使用AssignLC()函数,在INI文件中打开或新建一个Stream
writeStream2.AssignLC(*iniFile,TUid::(EData2));
_LIT(KSampleText,"Hello World");
TBuf<32> str = KSampleText;
writeStream2 << str;
writeStream2.CommitL();
//最后将Stream中的数据写入INI文件
iniFile->CommitL();
//弹出已经压入清除栈的变量:iniFile,writeStream,writeStream2
CleanupStack::PopAndDestroy(3);
iniFile = NULL;
}
从INI文件中读取数据的过程与写入数据的过程类似,这里需要使用RDictionaryReadStream类,该类是RReadStream的派生类。该类的OpenLC()函数通过INI文件的指针和UID的值打开UID对应的流,之后使用RReadStream类的函数读取流中的值。使用CDictionaryStore类时,可以根据不同的UID值获得不同流的指针,因此读写INI文件中的数据时可以补按照特定的顺序。例如:
void CMyAppUi::RestoreL()
{
CDictionaryStore* iniFile=Application()->OpenIniFileLC(iCoeEnv->FsSession);
//读取INI文件中字符串的值
RDictionaryReadSteam readStream;
//使用OpenLC()函数,通过UID获得该UID对应的Stream
readStream.OpenLC(*iniFile,TUid::Uid(EData2));
TBuf<32> str;
readStream >>str;
//读取整型值
RDictionaryReadStream readStream2;
readStream2.OpenLC(*iniFile,TUid::Uid(EData1));
TInt64 a;
readStream2>>a;
//弹出已经压入清除栈的变量:iniFile,readStream,readStream2
CleanupStack::PopAndDestroy(3);
iniFile=NULL;
}