cocos2dx-2.x CCFileUtils文件管理分析(2)

cocos2dx-2.x CCFileUtils文件管理分析(2)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

于1于,我只是对整体结构进行了分析,然后,2于,我会在一些我们经常使用的分析功能。

//获取给定文件名称的全路径 //以下这非常长一段凝视。通过举样例,像我们说明cocos2dx获取文件全路径的规则。 //这段我就不翻译了,直接通过代码来看。 /** Returns the fullpath for a given filename. First it will try to get a new filename from the "filenameLookup" dictionary. If a new filename can't be found on the dictionary, it will use the original filename. Then it will try to obtain the full path of the filename using the CCFileUtils search rules: resolutions, and search paths. The file search is based on the array element order of search paths and resolution directories. For instance: We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") to resolutions vector by setSearchResolutionsOrder. The "internal_dir" is relative to "Resources/". If we have a file named 'sprite.png', the mapping in fileLookup dictionary contains `key: sprite.png -> value: sprite.pvr.gz`. Firstly, it will replace 'sprite.png' with 'sprite.pvr.gz', then searching the file sprite.pvr.gz as follows: /mnt/sdcard/resources-ipadhd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/resources-ipad/sprite.pvr.gz (if not found, search next) /mnt/sdcard/resources-iphonehd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/sprite.pvr.gz (if not found, search next) internal_dir/resources-ipadhd/sprite.pvr.gz (if not found, search next) internal_dir/resources-ipad/sprite.pvr.gz (if not found, search next) internal_dir/resources-iphonehd/sprite.pvr.gz (if not found, search next) internal_dir/sprite.pvr.gz (if not found, return "sprite.png") If the filename contains relative path like "gamescene/uilayer/sprite.png", and the mapping in fileLookup dictionary contains `key: gamescene/uilayer/sprite.png -> value: gamescene/uilayer/sprite.pvr.gz`. The file search order will be: /mnt/sdcard/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/gamescene/uilayer/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-ipadhd/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-ipad/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/resources-iphonehd/sprite.pvr.gz (if not found, search next) internal_dir/gamescene/uilayer/sprite.pvr.gz (if not found, return "gamescene/uilayer/sprite.png") If the new file can't be found on the file system, it will return the parameter pszFileName directly. @since v2.1 */ virtual std::string fullPathForFilename(const char* pszFileName); -->> std::string CCFileUtils::fullPathForFilename(const char* pszFileName){ CCAssert(pszFileName != NULL, "CCFileUtils: Invalid path"); //推断是否是绝对路径,假设是绝对路径就直接返回。 /* //android下 推断根据就是是否以'/'开头或者以assets/开头。

以下这个函数。凝视的非常清楚。 //你能够做个实验: //例: Get data from file(/second_bg.png) failed! 我在创建精灵时传递/second_bg.png路径 bool CCFileUtilsAndroid::isAbsolutePath(const std::string& strPath) { // On Android, there are two situations for full path. // 1) Files in APK, e.g. assets/path/path/file.png // 2) Files not in APK, e.g. /data/data/org.cocos2dx.hellocpp/cache/path/path/file.png, or /sdcard/path/path/file.png. // So these two situations need to be checked on Android. if (strPath[0] == '/' || strPath.find(m_strDefaultResRootPath) == 0) { return true; } return false; } */ std::string strFileName = pszFileName; if (isAbsolutePath(pszFileName)) { //CCLOG("Return absolute path( %s ) directly.", pszFileName); return pszFileName; } // Already Cached ? //是否已经缓存。假设缓存过,直接返回 std::map<std::string, std::string>::iterator cacheIter = m_fullPathCache.find(pszFileName); if (cacheIter != m_fullPathCache.end()) { //CCLOG("Return full path from cache: %s", cacheIter->second.c_str()); return cacheIter->second; } /* std::string CCFileUtils::getNewFilename(const char* pszFileName) { const char* pszNewFileName = NULL; // in Lookup Filename dictionary ?

//能够把这个m_pFilenameLookupDict(默觉得NULL)字典理解为一种查找 //比方这个字典里存了一个"fish.png(key)" --> "big_fish.png(value)" //那么我们传入fish.png是,就会给我们转化为big_fish.png。

假设没有,则返回我们传入的。

CCString* fileNameFound = m_pFilenameLookupDict ?

(CCString*)m_pFilenameLookupDict->objectForKey(pszFileName) : NULL; if( NULL == fileNameFound || fileNameFound->length() == 0) { pszNewFileName = pszFileName; } else { pszNewFileName = fileNameFound->getCString(); //CCLOG("FOUND NEW FILE NAME: %s.", pszNewFileName); } return pszNewFileName; } */ // Get the new file name. std::string newFilename = getNewFilename(pszFileName); string fullpath = ""; //以下这一段非常关键: //m_searchPathArray 前面介绍过搜索路径数组,须要我们手动设置。

android的初始话会加入一个默认值为 //m_searchPathArray.push_back(m_strDefaultResRootPath)即,"assets/"。 /* m_searchResolutionsOrderArray 能够理解为分辨率搜索顺序,就按开头凝视说明的那样 //m_searchPathArray We set two elements("/mnt/sdcard/", "internal_dir/") to search paths vector by setSearchPaths, //m_searchResolutionsOrderArray and set three elements("resources-ipadhd/", "resources-ipad/", "resources-iphonehd") to resolutions vector by setSearchResolutionsOrder. //组合后的路径 /mnt/sdcard/resources-ipadhd/sprite.pvr.gz (if not found, search next) /mnt/sdcard/resources-ipad/sprite.pvr.gz (if not found, search next) /mnt/sdcard/resources-iphonehd/sprite.pvr.gz (if not found, search next) 总结:从这里能够看出,m_searchPathArray在前面的路径,会优先搜索。m_searchResolutionsOrderArray也一样。 */ for (std::vector<std::string>::iterator searchPathsIter = m_searchPathArray.begin(); searchPathsIter != m_searchPathArray.end(); ++searchPathsIter) { for (std::vector<std::string>::iterator resOrderIter = m_searchResolutionsOrderArray.begin(); resOrderIter != m_searchResolutionsOrderArray.end(); ++resOrderIter) { //CCLOG("\n\nSEARCHING: %s, %s, %s", newFilename.c_str(), resOrderIter->c_str(), searchPathsIter->c_str()); //以下我分析一下这个函数:-->> 2 fullpath = this->getPathForFilename(newFilename, *resOrderIter, *searchPathsIter); //这里会对找到的路径,进行缓存 if (fullpath.length() > 0) { // Using the filename passed in as key. m_fullPathCache.insert(std::pair<std::string, std::string>(pszFileName, fullpath)); //CCLOG("Returning path: %s", fullpath.c_str()); return fullpath; } } } //CCLOG("cocos2d: fullPathForFilename: No file found at %s. Possible missing file.", pszFileName); // The file wasn't found, return the file name passed in. return pszFileName;}--> 2//filename -- 传入的文件名称//searchPath -- 搜索路径//resolutionDirectory -- 资源分辨率路径std::string CCFileUtils::getPathForFilename(const std::string& filename, const std::string& resolutionDirectory, const std::string& searchPath){ std::string file = filename; std::string file_path = ""; size_t pos = filename.find_last_of("/"); if (pos != std::string::npos) { file_path = filename.substr(0, pos+1); file = filename.substr(pos+1); } //假设传入的"gamescene/uilayer/sprite.png"是这种路径。那么进行一定的处理, //处理成:path = searchPath + gamescene/uilayer/ + resourceDirectory file = sprite.png ///mnt/sdcard/ gamescene/uilayer/ resources-ipadhd/sprite.pvr.gz // searchPath + file_path + resourceDirectory std::string path = searchPath; path += file_path; path += resolutionDirectory; path = getFullPathForDirectoryAndFilename(path, file); //CCLOG("getPathForFilename, fullPath = %s", path.c_str()); return path;}-->>std::string CCFileUtils::getFullPathForDirectoryAndFilename(const std::string& strDirectory, const std::string& strFilename){ std::string ret = strDirectory+strFilename; //假设文件存在。就把文件的路径返回,这个路径可能是绝对路径,也可能是包里的路径 if (!isFileExist(ret)) { ret = ""; } return ret;}-->>//把上面合成的整个文件路径传进去,推断文件是否存在bool CCFileUtilsAndroid::isFileExist(const std::string& strFilePath){ if (0 == strFilePath.length()) { return false; } bool bFound = false; // Check whether file exists in apk. //假设不是以'/'开头,就在android包里查找 if (strFilePath[0] != '/') { //假设不是以"assets/"开头,则插入 std::string strPath = strFilePath; if (strPath.find(m_strDefaultResRootPath) != 0) {// Didn't find "assets/" at the beginning of the path, adding it. strPath.insert(0, m_strDefaultResRootPath); } //在安装包里查找,看是否存在 if (s_pZipFile->fileExists(strPath)) { bFound = true; } } else { //假设是绝对路径,看否打开成功。假设成功,则证明文件存在。

FILE *fp = fopen(strFilePath.c_str(), "r"); if(fp) { bFound = true; fclose(fp); } } return bFound;}总结:这里须要知道一点。就是先载入搜索路径的路径,会优先搜索。 例如热更新,我们只是想更新的路径在你面前的设置就可以。

版权声明:原创文章,转载请注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116935.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java Calendar 中设置时间为0点 0 分 0 秒

    java Calendar 中设置时间为0点 0 分 0 秒publicstaticvoidmain(String[]args){ Calendarcalendar=Calendar.getInstance(); //时 calendar.set(Calendar.HOUR_OF_DAY,0); //分 calendar.set(Calendar.MINUTE,0); //秒 calend…

    2022年5月29日
    33
  • 【PotPlayer】敲好用的本地视频播放器

    【PotPlayer】敲好用的本地视频播放器软件简介PotPlayer是KMPlayer的原作者姜勇囍进入Daum公司后的新一代作品,目前仍有更新。由于采用Delphi编译程序的KMPlayer有一些弊端,姜勇囍为改进播放器本身的一些性能而重新用VC++进行构架。虽然PotPlayer与KMPlayer同属一个开发者的产品,但它与KMPlayer所注重的地方并不同,能够满足不同用户的使用需求。因该软件的官方网站托管于DAUM平台,中国大陆网络可能受防火长城(GFW)影响而无法正常访问。官方网站https://potplayer.daum.

    2022年7月14日
    37
  • python执行cmd命令并解析结果_python如何打包成可执行程序

    python执行cmd命令并解析结果_python如何打包成可执行程序身为一个编程小白,最近刚刚接手工作。近期在使用pyinstaller的时候,发现了一个很严重的问题,那就是缺少包。当时并不知道,因为代码已经是上任大佬写好的,我可以直接用。先说一下问题吧(图片忘了保存)。执行文件突然死掉,当时手速够快截了一个图。原因是缺少了这么个包。pkg_resources.py2_warn具体的解决方法如下:顺便说一下,pyinstaller的安装方法,很简单。首先打开你的pycharm,然后点击左下角的Terminal之后输入命令 pipinstallpyins

    2022年8月28日
    1
  • pytest指定用例_pytest如何循环执行用例

    pytest指定用例_pytest如何循环执行用例前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

    2022年7月30日
    36
  • 几种java反编译软件的安装以及使用总结

    几种java反编译软件的安装以及使用总结公司要和别的公司合作,有些代码不希望让他们知道,最近老大们在弄代码混淆的事,而我就做起了测试代码混淆的工作。印象笔记更新之后不能用了,就整理在博客上吧。下面是在网上找的几种反编译软件的安装以及使用:一、JD-JUI官网下载链接:http://jd.benow.ca/下载之后解压,点击“jd-gui.exe”运行:直接将".jar"文件拖入进去即可查看里边的“.class”文件,如上图所示。二:Lu…

    2022年6月3日
    45
  • JS获取当前时间(精确到秒)「建议收藏」

    JS获取当前时间(精确到秒)「建议收藏」js获取当前日期currentDate(){vard=newDate();varyear=d.getFullYear();varmonth=d.getMonth();month=month+1>12?1:month+1;month=month>9?month:”0″+month.toString();var

    2022年9月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号