文件系统开发--文件流操作
2010-03-30 13:06
330 查看
流的读写操作通过基类RReadStream类和RWriteStream类实现。例如CommitL()函数用于最终写入数据,WriteL()函数用于外部化数据,ReadL()函数用于内部化数据。根据不同的媒体,又有不同的派生类,读写文件流的派生类是RFileReadStream类和RWriteFileStream类。写入文件流时,需要使用RFileWriteStream::Create()函数创建文件,从文件流读取数据时需要使用RFileReadStrea::Open()函数打开文件。
Symbian OS 中的大部分文件操作的函数都不会异常退出,而是返回错误值。所以当某些操作的错误影响之后的程序时,需要使用User::LeaveIfError()函数强行异常退出。将RWriteStream类及其派生类的对象压入清除栈时,不要使用清除栈的PushL()函数,而是用该类对象的PushL()函数。使用RFileWriteStream将一个TInt16类型的值写入流中的参考代码如下:
void WriteToStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)
{
RFileWriteStream write;
//使用RWriteStream::PushL(),而不是清除栈的PushL()
writer.PushL();
User::LeaveIfError(writer.Create(aFs,aFileName,EFileWriter));
writer<<*aInt;
//CommitL()之后,数据不能rollback
writer.CommitL();
//使用RWriteStream::Pop(),而不是清除栈的Pop()
writer.Pop();
//使用Release函数释放RWriteStream
writer.Release();
}
弹出清除栈时,可以使用对象的Pop()函数,然后使用Release()函数释放RWriteStream类的对象。也可以使用清除栈的PopAndDestroy()函数弹出并销毁该对象。这一规则也适用于RReadStream类,使用RReadStream类从stream中读取一个TInt16值的代码如下:
void ReadFromStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)
{
RFileReadStream reader;
//使用RReadStream::PushL函数压入清除栈
reader.PushL();
User::LeaveIfError(reader.Open(aFs,aFileName,EFileRead));
reader>>*aInt;
//使用清除栈的函数弹出并销毁RFileReadStream对象
//该语句的作用域{reader.Pop();reader.Release();}相同
CleanupStack::PopAndDestroy(); //reader
}
前面的代码中使用了操作符<<完成数据的外部化,使用>>完成数据的内部化。
为了保证流的顺序不受影响,一定要确保读写时指定的操作数长度和次序相同,例如:
TInt i = 1234;
TInt32 j = 5678;
writer.WriteInt32L(i);
writer<<j;
....
i = reader.ReadInt32L(i);
reader>>j;
使用操作符<<将字符串外部化到流中时,不再要求字符串是8位的,也不限制字符串的长度,操作符<<会在流中记录这些信息,以保障内部化的时候可以正确读出字符串的内容。
_LIT(KSampleText,"Hello World");
TBuf<20> text = KSampleText;
writer<<text;
...
TBuf<20> text2;
reader>>text2;
对于任何类型的一个类,例如“T”类型的类,“C”类型的类或者一个独立的类,需要实现ExternalizeL()函数和InternalizeL()函数,之后可以使用操作符“<<”和“>>”写读该类对象中的数据到流中。例如:
class AnyClass
{
public:
...
void ExternalizeL(RWriteSteam& aStream)
{
aSteam<<iText;
aStream<<iInt;
aStream<<iReal;
}
void InterlizeL(RReadStream& aStream)
{
aSteam>>iText;
aStream>>iInt;
aStream>>iReal;
}
private:
TBuf<32> iText;
TInt32 iInt;
TReal64 iReal;
}
外部化和内部化AnyClass类的对象时,可以使用操作符“<<”和“>>”
AnyClass object;
writer<<object;
...
AnyClass object2;
reader>>object2;
或者直接使用ExternalizeL()函数和Internalize()函数,运行效果一样
AnyClass object;
object.ExternalizeL(writer);
...
AnyClass object2;
object2.InternalizeL(reader);
Symbian OS 中的大部分文件操作的函数都不会异常退出,而是返回错误值。所以当某些操作的错误影响之后的程序时,需要使用User::LeaveIfError()函数强行异常退出。将RWriteStream类及其派生类的对象压入清除栈时,不要使用清除栈的PushL()函数,而是用该类对象的PushL()函数。使用RFileWriteStream将一个TInt16类型的值写入流中的参考代码如下:
void WriteToStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)
{
RFileWriteStream write;
//使用RWriteStream::PushL(),而不是清除栈的PushL()
writer.PushL();
User::LeaveIfError(writer.Create(aFs,aFileName,EFileWriter));
writer<<*aInt;
//CommitL()之后,数据不能rollback
writer.CommitL();
//使用RWriteStream::Pop(),而不是清除栈的Pop()
writer.Pop();
//使用Release函数释放RWriteStream
writer.Release();
}
弹出清除栈时,可以使用对象的Pop()函数,然后使用Release()函数释放RWriteStream类的对象。也可以使用清除栈的PopAndDestroy()函数弹出并销毁该对象。这一规则也适用于RReadStream类,使用RReadStream类从stream中读取一个TInt16值的代码如下:
void ReadFromStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)
{
RFileReadStream reader;
//使用RReadStream::PushL函数压入清除栈
reader.PushL();
User::LeaveIfError(reader.Open(aFs,aFileName,EFileRead));
reader>>*aInt;
//使用清除栈的函数弹出并销毁RFileReadStream对象
//该语句的作用域{reader.Pop();reader.Release();}相同
CleanupStack::PopAndDestroy(); //reader
}
前面的代码中使用了操作符<<完成数据的外部化,使用>>完成数据的内部化。
为了保证流的顺序不受影响,一定要确保读写时指定的操作数长度和次序相同,例如:
TInt i = 1234;
TInt32 j = 5678;
writer.WriteInt32L(i);
writer<<j;
....
i = reader.ReadInt32L(i);
reader>>j;
使用操作符<<将字符串外部化到流中时,不再要求字符串是8位的,也不限制字符串的长度,操作符<<会在流中记录这些信息,以保障内部化的时候可以正确读出字符串的内容。
_LIT(KSampleText,"Hello World");
TBuf<20> text = KSampleText;
writer<<text;
...
TBuf<20> text2;
reader>>text2;
对于任何类型的一个类,例如“T”类型的类,“C”类型的类或者一个独立的类,需要实现ExternalizeL()函数和InternalizeL()函数,之后可以使用操作符“<<”和“>>”写读该类对象中的数据到流中。例如:
class AnyClass
{
public:
...
void ExternalizeL(RWriteSteam& aStream)
{
aSteam<<iText;
aStream<<iInt;
aStream<<iReal;
}
void InterlizeL(RReadStream& aStream)
{
aSteam>>iText;
aStream>>iInt;
aStream>>iReal;
}
private:
TBuf<32> iText;
TInt32 iInt;
TReal64 iReal;
}
外部化和内部化AnyClass类的对象时,可以使用操作符“<<”和“>>”
AnyClass object;
writer<<object;
...
AnyClass object2;
reader>>object2;
或者直接使用ExternalizeL()函数和Internalize()函数,运行效果一样
AnyClass object;
object.ExternalizeL(writer);
...
AnyClass object2;
object2.InternalizeL(reader);
相关文章推荐
- java开发系统内核:创建文件操作API
- ios开发之文件系统操作
- AS/400开发经验点滴(一)询问类消息/BLOCK关键词/捕捉与文件操作有关的系统消息
- 【android开发】文件系统操作
- Node和Electron开发入门(四):操作PC端文件系统
- IOS开发 沙盒中的文件操作和文件系统NSFilemanager的操作
- 系统文件操作开发
- Android开发工具之Android Studio--调用系统隐藏方法之操作aidl文件步骤
- (0052)iOS开发之沙盒(sandbox)机制和文件操作(二)
- Verilog 中与文件操作相关的系统任务与系统函数
- WIN7网关问题问题“在释放接口 Loopback Pseudo-Interface 1 时出错: 系统找不到指定的文件。操作失败,没有适配器处于允许此操作的状态”解决方案
- node 操作文件流 fs 同步与异步 流式文件的写入与读取
- 5. Python开发--文件操作
- linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例
- UWP开发技巧:实现SMB协议操作文件服务器文件
- Windows 文件系统过滤驱动开发教程 (第二版)
- VS20xx IDE开发应用时_拷贝VS环境的库文件DLL到目标设备上运行的操作步骤
- 税务催缴催报信息打印程序开发-Delphi读取Excel文件及操作
- [GNU/Linux] Linux系统调用-文件操作(二)
- AndroidNDK开发之“文件操作”