前端之家收集整理的这篇文章主要介绍了
cocos2dx android fopen读取文件失败,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在cocos2dx中,提供了CCFileUitl来进行文件操作,但是大家一般习惯的方式还是仅仅通过这个类获取路径,然后用fopen相关的函数来操作,大概如下:
- stringfullPath=fullPathForFilename(pszFileName);
- FILE*fp=fopen(fullPath.c_str(),pszMode);
但是这样,windows和iOS正常无误,但是在android下面,会读取不到文件。之前遇到这个问题,没有解决,后面为了统一,改成了CCFileUtil的getFileData就没有出现过,也没有继续去追。
今天追了之后,发现,在android下,CCFileUtil有独立实现,在cocos2d-x-2.2.3/cocos2dx/platform/android/下面(引擎版本2.2.3),CCFileUtilsAndroid。其中getFileData的实现如下:
unsignedchar*CCFileUtilsAndroid::getFileData(constchar*pszFileName,char*pszMode,unsignedlong*pSize)
{
returndoGetFileData(pszFileName,pszMode,pSize,153);font-weight:bold;background-color:inherit;">false);
}
unsignedchar*CCFileUtilsAndroid::getFileDataForAsync(true);
unsignedchar*CCFileUtilsAndroid::doGetFileData(long*pSize,boolforAsync)
{
char*pData=0;
if((!pszFileName)||(!pszMode)||0==strlen(pszFileName))
return0;
}
stringfullPath=fullPathForFilename(pszFileName);
if(fullPath[0]!='/')
if(forAsync)
{
pData=s_pZipFile->getFileData(fullPath.c_str(),s_pZipFile->_dataThread);
else
else
do
CC_BREAK_IF(!fp);
longsize;
fseek(fp,SEEK_END);
size=ftell(fp);
pData=newunsignedchar[size];
size=fread(pData,sizeof(unsignedchar),size,fp);
fclose(fp);
if(pSize)
*pSize=size;
}while(0);
if(!pData)
std::stringmsg="Getdatafromfile(";
msg.append(pszFileName).append(")Failed!");
CCLOG("%s",msg.c_str());
returnpData;
}
注意
上面代码里面我标记注释的地方,
有个东西叫s_pZipFile
,之前看到这里,没注意这个东西。仔细一看,前面的fullpath的返回值,是一个相对于asset/的文件,也就是说,基本上都会走这个if,那么这个s_pZipFile又是怎么定义的。
#include"support/zip_support/ZipUtils.h"
staticZipFile*s_pZipFile=NULL;
CCFileUtils*CCFileUtils::sharedFileUtils()
if(s_sharedFileUtils==NULL)
s_sharedFileUtils=newCCFileUtilsAndroid();
s_sharedFileUtils->init();
std::stringresourcePath=getApkPath();
s_pZipFile=newZipFile(resourcePath,"assets/");
returns_sharedFileUtils;
重要的头文件我都留在上面了,所以其实上面那个getFileData的实现是这样的
char*ZipFile::getFileData(conststd::string&fileName,ZipFilePrivate*data)
char*pBuffer=NULL;
if(pSize)
*pSize=0;
do
CC_BREAK_IF(!data->zipFile);
CC_BREAK_IF(fileName.empty());
ZipFilePrivate::FileListContainer::const_iteratorit=data->fileList.find(fileName);
CC_BREAK_IF(it==data->fileList.end());
ZipEntryInfofileInfo=it->second;
intnRet=unzGoToFilePos(data->zipFile,&fileInfo.pos);
CC_BREAK_IF(UNZ_OK!=nRet);
nRet=unzOpenCurrentFile(data->zipFile);
CC_BREAK_IF(UNZ_OK!=nRet);
pBuffer=char[fileInfo.uncompressed_size];
intCC_UNUSEDnSize=unzReadCurrentFile(data->zipFile,pBuffer,fileInfo.uncompressed_size);
CCAssert(nSize==0||nSize==(int)fileInfo.uncompressed_size,"thefilesizeiswrong");
*pSize=fileInfo.uncompressed_size;
unzCloseCurrentFile(data->zipFile);
}while(0);
returnpBuffer;
}