symbian 文件读写及读写流

1. FileServer之文件操作: a. 遍历指定文件目录 RFs& rs = CCoeEnv::Static()->FsSession(); // 建立一个文件服务器回话 CDir* dirEntryList = NULL; // 用来保存获取到的目录下的条目 _LIT(KPath, “C://Nokia//”); // 文件夹目录的路径 // 使用文件服务器回话来遍历文件夹目录 User::LeaveIfError(fs.GetDir(/*const TDesC& */ KPath, // 要遍历的文件目录路径 /* TUint */ KEntryAttNormal, // 要获取的文件属性(非系统和隐藏文件) /* TUint */ ESortByName, // 按名字排序 /* CDir*& */ dirEntryList // 返回的文件和目录条目指针 ) ); // 遍历文件目录条目 For(Tint i =0; i < dirEntryList->Count(); i++) { const TEntry& anEntry = (*dirEntryList)[i]; TBuf name = anEntry.iName; TUint attribute = anEntry.iAtt; TInt size = anEntry.iSize; } // 删除文件以及目录条目列表 delete dirEntryList; dirEntryList = NULL; ######################################################################3 b. 读写文件在读写之前必须先建立一个文件服务器对话(RFs),RFile提供的读写文件功能只针对二进制数据或者ascii文本(读写针对的文件类型是位描述符byte descriptor,即TDes8, TDesC8),调用RFile::Close()时,会自动将cached data刷新到文件当中,但是如果出错,它并不返回任何错误值,所以最好在调用Close()之前,先调用Flush() RFile::Create() RFile::Open() RFile::Replace() RFile::Flush() RFile::Close() 使用流来进行读写操作对于想要实现流操作的类,必须实现以下两个操作: ExternalizeL(): 将其状态输出到流中以bit的形式保存 InternalizeL(): 将流中的bit读到对象中来 RWriteStream提供将一下的变量类型序列化到文件中: TInt, TUint, TReal, TReal64, descriptor, 读入流(RReadStream) 调用RWriteStream::CommitL()提交写入操作。 class CMyObject : public CBase { ... private: // Data TUint8 iX1; TUint16 iX2; TUint32 iX3; TInt8 iY1; TInt16 iY2; TInt32 iY3; TReal32 iZ1 TReal64 iZ2; }; void CMyObject::ExternalizeL(RWriteStream& aStream) { aStream.WriteUint8L( iX1 ); aStream.WriteUint16L( iX2 ); aStream.WriteUint32L( iX3 ); aStream.WriteInt8L( iY1 ); aStream.WriteInt16L( iY2 ); aStream.WriteInt32L( iY3 ); aStream.WriteReal32( iZ1 ); aStream.WriteReal64( iZ2 ); } void CMyObject::InternalizeL(RReadStream& aStream) { iX1 = aStream.ReadUint8L(); iX2 = aStream.ReadUint16L(); iX3 = aStream.ReadUint32L(); iY1 = aStream.ReadInt8L(); iY2 = aStream.ReadInt16L(); iY3 = aStream.ReadInt32L(); iZ1 = aStream.ReadReal32(); iZ2 = aStream.ReadReal64(); } CMyObject iObject; ... RFs& fs = CCoeEnv::Static()->FsSession(); RFileReadStream readStream; RFileWriteStream writeStream; writeStream.Create(fs, KTxtFileName, EFileWrite); writeStream.PushL(); iObject.ExternalizeL(writeStream); writeStream.CommitL(); writeStream.Pop(); writeStream.Release(); readStream.Open(fs, KTxtFileName, EFileRead)); readStream.PushL(); iObject.InternalizeL(readStream); readStream.Pop(); readStream.Release(); c. 删除文件 RFs::Delete(): 删除指定的文件,该文件不能处于打开状态,并且它不能是系统或只读文件 RFs::RmDir():删除指定的目录,目录名必须以"/"结尾,该目录必须为空,且不能为根目录 Symbian文件操作整理本文不断更新中… 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(); Symbian文件操作整理本文不断更新中… 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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值