TInt RFile::Seek(TSeek aMode,TInt& aPos) const函数,当输入参数aPos超过文件范围时,函数不会返回错误值。
我在CFileSource类里面实现了这样一个函数
TInt CFileSource::DoSeek(TInt aPos)
{
TInt err = iRFile.Seek(ESeekStart, aPos);
if(err == KErrNone)
{
iFilePos = aPos;
iRdPos = iWrPos = iBufferSize;
iReadPending = EFalse;
}
return err;
}
以上实现看似没有问题,但当传入的参数aPos大于文件size时,iRFile.Seek(ESeekStart, aPos)返回KErrNone,导致外层逻辑出错。
我测试了一下,如果aPos为负数,iRFile.Seek()会返回KErrArgument,但aPos大于iFileSize时,返回KErrNone,这在SDK中并没有说明。
解决方法 1:函数外部保护
外层调用CFileSource::DoSeek(TInt aPos)时,检查参数,保证aPos不会越界。这种方法增加了外层的逻辑复杂性。
解决方法 2:函数内部保护
TInt CFileSource::DoSeek(TInt aPos)
{
if (aPos > iFileSize)
{
iEof = ETrue;
return KErrEof;
}
TInt err = iRFile.Seek(ESeekStart, aPos);
if(err == KErrNone)
{
iFilePos = aPos;
iRdPos = iWrPos = iBufferSize;
iReadPending = EFalse;
iEof = (aPos == iFileSize) ? ETrue : EFalse;
}
return err;
}