Symbian文件操作整理

来源:互联网 发布:js设置浏览器缩放比例 编辑:程序博客网 时间:2024/05/16 16:07

BaflUtils
Location: BAUTILS.H
Link against: bafl.lib
BaflUtils(Basic Application Framework Library)提供的全是静态方法,使用起来非常爽,提供诸如FileExists、PathExists(文件夹全路径)、FolderExists(不必指定盘符)等方法。不过这些方法都需要传递一个RFs&,BaflUtils需要有这么个FileSession才能进行相关操作。

EikFileUtils
Location: EIKFUTIL.H
Link against: eikcore.lib
类似于BaflUtils类,最大的不同在于这个类的静态方法不需要传递RFs&,因此这个类经常用于GUI App中。不过这个类的方法没有BaflUtils来得全面,比如居然没有FileExists方法。

CFileMan
Location: f32file.h
Link against: efsrv.lib
以上两个类本质上是对一个CFileMan的封装。FileMan==FileManager,提供了Copy、Delete、Move、Attribs(改文件属性)等方法,通过NewL(RFs&)方法可以构造一个CFileMan,然后就可以通过它来操作文件了。
CFileMan::NewL()有一个重载版本支持传入一个MFileManObserver指针作为参数,或者可以通过SetObserver()设定观察者,利用这个观察者可以监视文件状况,以便对特定文件的复制、删除等操作进行响应。

RFs
Location: f32file.h
文件操作当然不能不提RFs咯,这么重量级别的人物。
个人理解EikFileUtils、BaflUtils都是通过RFs来调用CFileMan操作文件,这里面的关系还真TMD错综复杂啊,不过咱小程序员一个,不必深究太多,能用则用呗。RFs提供的方法真是多得吓人,应有那个尽有。我就不啰嗦了,自己查API Doc去。

TParse/TParsePtr/TParsePtrC
Location: f32file.h
Link against: efsrv.lib
这又是一系列好玩又方便的类。后两个最好用,以TParsePtr为例:
其构造函数TParsePtr(TDes&)接受一个TDes引用作为参数,可以对这个TDes进行一系列的判断及操作。可以往这个TDes中追加文件夹、分离文件名、分离后缀名等等实用的操作。这样就不用大费周章地自己进行描述符操作,就能很智能地处理文件路径了,是不是很酷呢?
而TParsePtrC(TDesC&)除了不能用那些修改文件名的函数,其余功能和TParsePtr一致(所有的函数都定义在基类TParseBase中)。

文件操作当然包含文件读写咯,在此也作一下整理。
TFileText
Location: f32file.h
Link against: efsrv.lib
这个类是我最喜欢用的,因为它够简洁够方便。
处理单行的文本文件读写(单行最大256个字符),文件编码必须是UTF-16 LE。
提供的函数也少得可怜:Read(), Seek(), Set(), TFileText(), Write() 其中还有一个是默认构造函数,真是可怜无比。但是很实用就是了,在做Console Exe的时候,用这个类来读写文件那是相当爽快。没有调研过控制台程序是否也有支持ini文件的API,但是自己用TFileText写一个读写ini文件的类也是很方便的事。
伪代码如下:
TFileText ft; // you can also alloc ft with new operator
ft.Set(…);
TBuf<256> line; // you may want to use HBufC or RBuf…
while(KErrEof != ft.Read(line))
{
// your operation to line
}

ft.Write(…); // auto insert your TDesC into the new line

CLineReader
Location: VERSIT.H
Link against: versit.lib
类如其名,这个类只支持单行读,不支持写。不过用起来也不算太麻烦,因为是通过流读取的,所以没有单行256个字符的限制。
据我测试,文件编码必须是UTF-8 without BOM(就是文件头不带EFBBBF三个字节,这三个字节对于UTF-8编码来说不是必需的,但是Windows平台下的UTF-8编码文件都有这三个字节),UTF-16的貌似不支持,下次作一个详尽的测试。
示例代码:
RFs fs;
User::LeaveIfError(fs.Connect());
RFileReadStream fileReadStream;
fileReadStream.Open(fs,KConfigFilePath,EFileStreamText);
CLineReader* lineReader = CLineReader::NewL(fileReadStream);

TInt err(KErrNone);
while(true)
{
lineReader->ReadLineL(0,err);
if(KErrEof == err)
{
break;
}
// do sth with lineReader->iBufPtr
}
delete lineReader;
fileReadStream.Close();
fs.Close();
很方便吧。

RFile
Location: f32file.h
Link against: efsrv.lib
创建或者打开一个文件,可以对文件进行所有的操作,读啊写啊,改名改属性等等。
从Read()、Write()的所有重载版本看,参数都是TDesC8/TDes8 的,看来应该是对UTF-8 without BOM编码的文件适用。另外Read()、Write()都提供了同步、异步两种方式,可以按需要选用。

RFileReadStream/RFileWriteStream
Location: S32FILE.H
Link against: estor.lib
从RReadStream/RWriteStream派生出来的文件流。
示例代码:
RFileWriteStream writer;
writer.PushL(); //推上清洁栈
User::LeaveIfError(writer.Replace(fileSession, KFileName, EFileWrite)); //将流与文件绑定
writer << aTxt; //将aTxt的内容写入流
writer.CommitL(); //提交,相当于Flush
writer.Pop();
writer.Close();

原创粉丝点击