在2中,我们分析了几个函数,在这一篇中我们继续分析其他一些函数。
1、
在2中,多次用到了m_searchPathArray(搜索路径),那这个搜索路径怎么来的呢?
我们可以通过setSearchPaths这个函数来设置搜索路径
void CCFileUtils::setSearchPaths(const std::vector<std::string>& searchPaths)
{
bool bExistDefaultRootPath = false;
//先把以前的清空,包括缓存路径
m_fullPathCache.clear();
m_searchPathArray.clear();
//逐个加入到m_searchPathArray
for (std::vector<std::string>::const_iterator iter = searchPaths.begin(); iter != searchPaths.end(); ++iter)
{
std::string strPrefix;
std::string path;
//如果不是绝对路径,android的则加上"assets/"前缀,表明需要去安装包里找
if (!isAbsolutePath(*iter))
{ // Not an absolute path
strPrefix = m_strDefaultResRootPath;
}
//如果路径不是以'/'结尾,则在结尾加上'/'
path = strPrefix+(*iter);
if (path.length() > 0 && path[path.length()-1] != '/')
{
path += "/";
}
if (!bExistDefaultRootPath && path == m_strDefaultResRootPath)
{
bExistDefaultRootPath = true;
}
m_searchPathArray.push_back(path);
}
if (!bExistDefaultRootPath)
{
//如果m_strDefaultResRootPath默认路径不在m_searchPathArray,则加入进来
//CCLOG("Default root path doesn't exist,adding it.");
m_searchPathArray.push_back(m_strDefaultResRootPath);
}
}
-->>
void CCFileUtils::addSearchPath(const char* path_)
{
std::string strPrefix;
std::string path(path_);
if (!isAbsolutePath(path))
{ // Not an absolute path
strPrefix = m_strDefaultResRootPath;
}
path = strPrefix + path;
if (path.length() > 0 && path[path.length()-1] != '/')
{
path += "/";
}
m_searchPathArray.push_back(path);
}
//移除一个搜索路径:
void CCFileUtils::removeSearchPath(const char *path_)
{
std::string strPrefix;
std::string path(path_);
if (!isAbsolutePath(path))
{ // Not an absolute path
strPrefix = m_strDefaultResRootPath;
}
path = strPrefix + path;
if (path.length() > 0 && path[path.length()-1] != '/')
{
path += "/";
}
std::vector<std::string>::iterator iter = std::find(m_searchPathArray.begin(),m_searchPathArray.end(),path);
m_searchPathArray.erase(iter);
}
//移除全部
void CCFileUtils::removeAllPaths()
{
m_searchPathArray.clear();
}
2、
m_searchResolutionsOrderArray资源路径和上面的一样处理方式,就不说了。
3、
从pszRelativeFile这个文件的相对路径中,得到pszFilename文件的全路径,
其实就是找到pszRelativeFile文件的最后一个'/',然后去这个'/'前的所有字符 + pszFilename即可。
const char* CCFileUtils::fullPathFromRelativeFile(const char *pszFilename,const char *pszRelativeFile)
{
std::string relativeFile = pszRelativeFile;
CCString *pRet = CCString::create("");
pRet->m_sString = relativeFile.substr(0,relativeFile.rfind('/')+1);
pRet->m_sString += getNewFilename(pszFilename);
return pRet->getCString();
}
4、
//android下的可读写路径
string CCFileUtilsAndroid::getWritablePath()
{
// Fix for Nexus 10 (Android 4.2 multi-user environment)
// the path is retrieved through Java Context.getCacheDir() method
string dir("");
//pContext.getFilesDir().getAbsolutePath() java端
string tmp = getFileDirectoryJNI(); //pContext.getFilesDir().getAbsolutePath()
if (tmp.length() > 0)
{
dir.append(tmp).append("/");
return dir;
}
else
{
return "";
}
}
原文链接:https://www.f2er.com/cocos2dx/343660.html