关闭

Cocos2dx基础 | [cocos2dx 3.0 (一)] 对文件读写操作 +FileUtils类

518人阅读 评论(0) 收藏 举报
分类:

下面看一下Data类

01 class CC_DLL Data 
02
03 public
04     static const Data Null; 
05     //构造函数 
06     Data(); 
07     Data(const Data& other); 
08     Data(Data&& other); 
09     ~Data(); 
10     // 重载符号 
11     Data& operator= (const Data& other); 
12     Data& operator= (Data&& other); 
13    
14     unsigned char* getBytes() const;//获取数据 
15     ssize_t getSize() const;//尺寸 
16     void copy(unsigned char* bytes, const ssize_t size);//从bytes复制 
17     void fastSet(unsigned char* bytes, const ssize_t size);//从bytes快速set,使用后bytes将不能在外部使用 
18     void clear();//清除 
19     bool isNull() const;//判空 
20 private
21     void move(Data& other); 
22 private
23     unsigned char* _bytes; 
24     ssize_t _size; 
25 };

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"
03 <plist version="1.0"
04 <dict> 
05     <key>filenames</key> 
06     <dict> 
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> 
13     </dict> 
14     <key>metadata</key> 
15     <dict> 
16         <key>version</key> 
17         <integer>1</integer> 
18     </dict> 
19 </dict> 
20 </plist>

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) 
02
03 #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) 
04     return CCFileUtils::getInstance()->isFileExist(pFileName); 
05 #else 
06     if(GetFileAttributesA(pFileName.c_str()) == INVALID_FILE_ATTRIBUTES) 
07         return false
08     return true
09 #endif 
10 }

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() 
02
03 #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) 
04     return CCFileUtils::getInstance()->getWritablePath(); 
05 #else 
06     char full_path[MAX_PATH + 1]; 
07     ::GetModuleFileNameA(NULL, full_path,MAX_PATH + 1); 
08     std::string ret((char*)full_path); 
09     // remove xxx.exe 
10     ret =  ret.substr(0, ret.rfind("\\") + 1); 
11     ret = convertPathFormatToUnixStyle(ret); 
12     return ret; 
13 #endif 
14 }

下面是保存文件:

01 bool wFileIO::saveFile(const char* pContentString, const std::string& pFileName) 
02
03     std::string fn=convertPathFormatToUnixStyle(pFileName); 
04     int np=fn.rfind('/'); 
05     if(np!=std::string::npos) 
06         if(!mkDirM(fn.substr(0,np))) 
07             return false
08    
09     std::string path = getWritablePath()+fn; 
10     FILE* file = fopen(path.c_str(), "w");   
11     if (file) 
12     {   
13         fputs(pContentString, file);   
14         fclose(file);  
15         log("save file [%s]",path.c_str());   
16         return true
17     
18     else 
19         log("fail to save file [%s]!",path.c_str()); 
20     return false
21
22 //检测各级文件夹,不存在则创建 
23 bool wFileIO::mkDirM(const std::string& pDirName) 
24
25     std::string path = getWritablePath(); 
26     int np=pDirName.find('/',0); 
27     while(np!=std::string::npos) 
28     
29         if(!mkDir(path+pDirName.substr(0,np))) 
30             return false
31         np=pDirName.find('/',np+1); 
32     
33     return mkDir(path+pDirName); 
34
35    
36 //创建文件夹 
37 bool wFileIO::mkDir(const std::string& pDirName) 
38
39 #if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) 
40     DIR *pDir = NULL; 
41     //打开该路径 
42     pDir = opendir (pDirName.c_str()); 
43     if (! pDir) 
44     
45     //创建该路径 
46         if(!mkdir(pDirName.c_str(), S_IRWXU | S_IRWXG | S_IRWXO)) 
47         
48             log("fail to create dir [%s]",pDirName.c_str()); 
49             return false
50         
51         log("create dir [%s]",pDirName.c_str()); 
52     
53 #else 
54     if ((GetFileAttributesA(pDirName.c_str())) == INVALID_FILE_ATTRIBUTES) 
55     
56         if(!CreateDirectoryA(pDirName.c_str(), 0)) 
57         
58             log("fail to create dir [%s]",pDirName.c_str()); 
59             return false
60         
61         log("create dir [%s]",pDirName.c_str()); 
62     
63 #endif 
64        
65     return true
66
67 //路径格式转为UnixStyle,"c:\xxx.txt" --> "c:/xxx.txt" 
68     static inline std::string convertPathFormatToUnixStyle(const std::string& path) 
69     {  
70         std::string ret = path; int len = ret.length(); 
71         for (int i = 0; i < len; ++i)  
72         {  
73             if (ret[i] == '\\')  
74             {  
75                 ret[i] = '/';  
76             }  
77         }  
78         return ret; 
79     }

      

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52165次
    • 积分:1207
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:102篇
    • 译文:0篇
    • 评论:2条
    心情倍儿爽,扫扫这玩意吧~-~
    支付宝
    社交联系号

    QQ:943367080

    微信:943367080

    新浪微博:如果来生是棵树