注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

尐鬼じ☆ve伱

和你在一起的日子

 
 
 

日志

 
 

Symbian文件操作整理+RFile中Seek函数的使用 (转)  

2012-04-05 12:03:20|  分类: symbian |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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();

在看看Seek的操作
RFile::Read()和RFile::Write()函数都使用一个共同的文件位置指针,该指针在打开文件时默认指向文件的开头,每次成功的读写N个字节数据时,该指针都会向后移动N个字节。Read()和Write()函数都有从指定位置读写的重载函数,此时文件指针会从指定位置偏移N个字节。RFile类还提供专门用于移动文件指针的Seek()函数,该函数提供了多种定位文件指针的方式,包括从文件头移动N个字节、从文件结尾移动N个字节、从当前位置移动N个字节等。

摘自http://hi.baidu.com/songlin0512/blog/item/2b3c47136b518b58f819b8c5.html

TInt Seek(TSeek aMode, TInt &aPos) const;

TSeek枚举如下:

ESeekAddress
This can only be used for file systems with execute-in-place facilities, such as the ROM file system: the offset specifies the absolute address of the data.(这个是被用于文件系统中,以绝对地址访问数据,基本不使用)

ESeekStart
Destination is the start of file.

ESeekCurrent
Destination is the current position in file.

ESeekEnd
Destination is the end of file.

先说ESeekStart这个,pos的赋值必须大于零,否则返回参数错误。File.Seek(ESeekStart, aPos)的意思是把游标移动到文件起始偏移aPos的位置,如果aPos大于文件长度,则游标会移动到文件末尾。返回aPos是游标针对文件起始的偏移量。

File.Seek(ESeekCurrent, aPos = 100)的意思是传入的aPos值作为当前文件游标的偏移位置,假如当前游标在文件起始偏移100的位置,那么调用该函数则会使得游标移动到文件起始偏移200的位置,并且aPos将返回游标起始偏移的位置及aPos被赋值为200;如果传入的偏移值加上当前游标的起始偏移大于文件大小,则aPos将被赋值为文件长度。

File.Seek(ESeekEnd, aPos = 100)的使用与ESeekStart相似只是起始为文件末尾,返回aPos依然是游标针对文件起始的偏移量

  评论这张
 
阅读(375)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017