下面看一下Data类
04 | static const Data Null; |
07 | Data( const Data& other); |
11 | Data& operator= ( const Data& other); |
12 | Data& operator= (Data&& other); |
14 | unsigned char * getBytes() const ; |
15 | ssize_t getSize() const ; |
16 | void copy(unsigned char * bytes, const ssize_t size); |
17 | void fastSet(unsigned char * bytes, const ssize_t size); |
21 | void move(Data& other); |
23 | unsigned char * _bytes; |
unsigned char* getFileDataFromZip(const std::string& zipFilePath, const std::string& filename, ssize_t *size);//读取压缩文件数据(zip格式)
如果读取成功size中会返回文件的大小,否则返回0。
std::string fullPathForFilename(const std::string &filename);//获取文件的完整路径
如果我们通过setSearchPaths()设置搜索路径("/mnt/sdcard/", "internal_dir/"),然后通过setSearchResolutionsOrder()设置子区分路径("resources-ipadhd/", "resources-ipad/", "resources-iphonehd")。如果搜索文件名为'sprite.png' 那么会先在文件查找字典中查找key: sprite.png -> value: sprite.pvr.gz,然后搜索文件'sprite.pvr.gz'如下顺序:
1 | /mnt/sdcard/resources-ipadhd/sprite.pvr.gz ( if not found, search next) |
2 | /mnt/sdcard/resources-ipad/sprite.pvr.gz ( if not found, search next) |
3 | /mnt/sdcard/resources-iphonehd/sprite.pvr.gz ( if not found, search next) |
4 | /mnt/sdcard/sprite.pvr.gz ( if not found, search next) |
5 | internal_dir/resources-ipadhd/sprite.pvr.gz ( if not found, search next) |
6 | internal_dir/resources-ipad/sprite.pvr.gz ( if not found, search next) |
7 | internal_dir/resources-iphonehd/sprite.pvr.gz ( if not found, search next) |
8 | internal_dir/sprite.pvr.gz ( if not found, return "sprite.png" ) |
如果找到返回完整路径,没找到返回'sprite.png'。
void loadFilenameLookupDictionaryFromFile(const std::string &filename);//从文件导入文件名查找字典
文件为plist格式如下:
01 | <?xml version= "1.0" encoding= "UTF-8" ?> |
02 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > |
07 | <key>sounds/click.wav</key> |
08 | <string>sounds/click.caf</string> |
09 | <key>sounds/endgame.wav</key> |
10 | <string>sounds/endgame.caf</string> |
11 | <key>sounds/gem-0.wav</key> |
12 | <string>sounds/gem-0.caf</string> |
key对应string
void setFilenameLookupDictionary(const ValueMap& filenameLookupDict);//从ValueMap中设置文件名查找字典
ValueMap的定义:
1 | typedef std::unordered_map<std::string, Value> ValueMap; |
std::string fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile);//获取相对应文件的完整路径
e.g. filename: hello.png, pszRelativeFile: /User/path1/path2/hello.plist Return: /User/path1/path2/hello.pvr (If there a a key(hello.png)-value(hello.pvr) in FilenameLookup dictionary. )
void setSearchResolutionsOrder(const std::vector<std::string>& searchResolutionsOrder);//设置子搜索区分路径
见fullPathForFilename()。
void addSearchResolutionsOrder(const std::string &order);//增加子搜索路径
const std::vector<std::string>& getSearchResolutionsOrder();//获取子搜索区分路径
void setSearchPaths(const std::vector<std::string>& searchPaths);//设置搜索路径
见fullPathForFilename()。
void addSearchPath(const std::string & path);//增加搜索路径
const std::vector<std::string>& getSearchPaths() const;//获取搜索路径
std::string getWritablePath();//获取一个可写入文件的路径
经过测试在win32平台上,debug版本返回的是程序文件所在的路径,release返回的是“我的文档”路径。
bool isFileExist(const std::string& filePath);//判断文件是否存在
经过测试在win32平台上,如果路径中包含中文字符会找不到文件。所以可以自己写个
01 | bool wFileIO::isFileExist( const std::string& pFileName) |
03 | #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) |
04 | return CCFileUtils::getInstance()->isFileExist(pFileName); |
06 | if (GetFileAttributesA(pFileName.c_str()) == INVALID_FILE_ATTRIBUTES) |
bool isAbsolutePath(const std::string& path);判断是否为绝对路径
void setPopupNotify(bool notify);
bool isPopupNotify();
Sets/Gets 当文件加载失败时弹出messagebox.
ValueMap getValueMapFromFile(const std::string& filename);//从文件获取ValueMap
bool writeToFile(ValueMap& dict, const std::string& fullPath);//写入一个ValueMap数据到plist格式文件
ValueVector getValueVectorFromFile(const std::string& filename);//从文件获取ValueVector
ValueVector定义:
1 | typedef std::vector<Value> ValueVector; |
函数就这么多了,就在这里记录下,到时要用再来看看奋斗
因为没发现有直接写文件的函数,所以我这里自己写了下,虽然不知道再其他平台会怎样,再windows上用着再说大笑
再win32上realse版本getWritablePath()会获取“我的文档”,还是改成当前路径吧
01 | std::string wFileIO::getWritablePath() |
03 | #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) |
04 | return CCFileUtils::getInstance()->getWritablePath(); |
06 | char full_path[MAX_PATH + 1]; |
07 | ::GetModuleFileNameA(NULL, full_path,MAX_PATH + 1); |
08 | std::string ret(( char *)full_path); |
10 | ret = ret.substr(0, ret.rfind( "\\" ) + 1); |
11 | ret = convertPathFormatToUnixStyle(ret); |
下面是保存文件:
01 | bool wFileIO::saveFile( const char * pContentString, const std::string& pFileName) |
03 | std::string fn=convertPathFormatToUnixStyle(pFileName); |
05 | if (np!=std::string::npos) |
06 | if (!mkDirM(fn.substr(0,np))) |
09 | std::string path = getWritablePath()+fn; |
10 | FILE * file = fopen (path.c_str(), "w" ); |
13 | fputs (pContentString, file); |
15 | log ( "save file [%s]" ,path.c_str()); |
19 | log ( "fail to save file [%s]!" ,path.c_str()); |
23 | bool wFileIO::mkDirM( const std::string& pDirName) |
25 | std::string path = getWritablePath(); |
26 | int np=pDirName.find( '/' ,0); |
27 | while (np!=std::string::npos) |
29 | if (!mkDir(path+pDirName.substr(0,np))) |
31 | np=pDirName.find( '/' ,np+1); |
33 | return mkDir(path+pDirName); |
37 | bool wFileIO::mkDir( const std::string& pDirName) |
39 | #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) |
42 | pDir = opendir (pDirName.c_str()); |
46 | if (!mkdir(pDirName.c_str(), S_IRWXU | S_IRWXG | S_IRWXO)) |
48 | log ( "fail to create dir [%s]" ,pDirName.c_str()); |
51 | log ( "create dir [%s]" ,pDirName.c_str()); |
54 | if ((GetFileAttributesA(pDirName.c_str())) == INVALID_FILE_ATTRIBUTES) |
56 | if (!CreateDirectoryA(pDirName.c_str(), 0)) |
58 | log ( "fail to create dir [%s]" ,pDirName.c_str()); |
61 | log ( "create dir [%s]" ,pDirName.c_str()); |
68 | static inline std::string convertPathFormatToUnixStyle( const std::string& path) |
70 | std::string ret = path; int len = ret.length(); |
71 | for ( int i = 0; i < len; ++i) |