加入收藏 |
设为首页 |
会员中心 | 我要投稿
|
李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
Cocos2dx基础 | [cocos2dx 3.0 (一)] 对文件读写操作 +FileUtils
发布时间:2020-12-14 21:40:56 所属栏目:百科 来源:网络整理
导读:下面看一下Data类 01 class CC_DLL Data 02 { 03 public : 04 static const Data Null; 05 //构造函数 06 Data(); 07 Data( Data other); 08 Data(Data other); 09 ~Data(); 10 // 重载符号 11 Data operator= ( 12 Data operator= (Data other); 13 14 unsi
下面看一下Data类
|
static const Data Null; |
06
Data(); |
08
Data(Data&& other); |
10
// 重载符号 |
11 |
Data& operator= (12 |
Data& operator= (Data&& other); |
14
unsignedchar * getBytes() ; |
16
voidcopy(unsigned * bytes, ssize_t size); |
17 |
fastSet(unsigned//从bytes快速set,使用后bytes将不能在外部使用 |
18
clear(); |
20
private: |
22
23 |
* _bytes; |
24
ssize_t _size; |
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 (
3 |
/mnt/sdcard/resources-iphonehd/sprite.pvr.gz (4 |
/mnt/sdcard/sprite.pvr.gz (5 |
internal_dir/resources-ipadhd/sprite.pvr.gz (6 |
internal_dir/resources-ipad/sprite.pvr.gz (7 |
internal_dir/resources-iphonehd/sprite.pvr.gz (8 |
internal_dir/sprite.pvr.gz (return "sprite.png" ) |
如果找到返回完整路径,没找到返回'sprite.png'。
void loadFilenameLookupDictionaryFromFile(const std::string &filename);//从文件导入文件名查找字典
文件为plist格式如下:
<?xml version="1.0" encoding= "UTF-8" ?> |
<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"
>
<dict>
<key>sounds/click.wav</key>
<string>sounds/click.caf</string>
<key>sounds/endgame.wav</key> |
<string>sounds/endgame.caf</string>
<key>sounds/gem-0.wav</key> |
<string>sounds/gem-0.caf</string>
<key>metadata</key>
<key>version</key>
</dict>
key对应string
void setFilenameLookupDictionary(const ValueMap& filenameLookupDict);//从ValueMap中设置文件名查找字典
ValueMap的定义:
typedefstd::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);//设置搜索路径
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平台上,如果路径中包含中文字符会找不到文件。所以可以自己写个
wFileIO::isFileExist(
std::string& pFileName)
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
returnCCFileUtils::getInstance()->isFileExist(pFileName);
(GetFileAttributesA(pFileName.c_str()) == INVALID_FILE_ATTRIBUTES)
true;
}
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定义:
std::vector<Value> ValueVector;
函数就这么多了,就在这里记录下,到时要用再来看看奋斗
因为没发现有直接写文件的函数,所以我这里自己写了下,虽然不知道再其他平台会怎样,再windows上用着再说大笑
再win32上realse版本getWritablePath()会获取“我的文档”,还是改成当前路径吧
std::string wFileIO::getWritablePath()
CCFileUtils::getInstance()->getWritablePath();
::GetModuleFileNameA(NULL,full_path,MAX_PATH + 1); |
std::string ret((*)full_path);
ret = ret.substr(0,ret.rfind(""
) + 1);
ret = convertPathFormatToUnixStyle(ret); |
ret;
下面是保存文件:
wFileIO::saveFile(const * pContentString,monospace!important; font-size:10pt!important; min-height:inherit!important">std::string fn=convertPathFormatToUnixStyle(pFileName); |
intnp=fn.rfind(
'/'
);
(!mkDirM(fn.substr(0,np)))
std::string path = getWritablePath()+fn; |
FILE* file =
fopen
(path.c_str(),
"w"
(file)
fputs
(pContentString,file);
fclose(file);
log( "save file [%s]" ,path.c_str()); |
}
else
"fail to save file [%s]!" |
wFileIO::mkDirM(std::string& pDirName) |
std::string path = getWritablePath();
26
np=pDirName.find(
27 |
while28 |
29 |
(!mkDir(path+pDirName.substr(0,np))) |
30 |
31 |
32 |
} |
34
35 |
36 |
//创建文件夹 |
37 |
wFileIO::mkDir(38 |
39 |
40 |
DIR *pDir = NULL; |
42
pDir = opendir (pDirName.c_str()); |
44
45 |
//创建该路径 |
46
(!mkdir(pDirName.c_str(),S_IRWXU | S_IRWXG | S_IRWXO)) |
48
"fail to create dir [%s]"
49 |
50 |
51 |
"create dir [%s]"52 |
53 |
54 |
((GetFileAttributesA(pDirName.c_str())) == INVALID_FILE_ATTRIBUTES) |
55 |
56 |
(!CreateDirectoryA(pDirName.c_str(),0)) |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
//路径格式转为UnixStyle,"c:xxx.txt" --> "c:/xxx.txt" |
68 |
inlinestd::string convertPathFormatToUnixStyle( std::string& path) |
69 |
70 |
std::string ret = path;len = ret.length(); |
71 |
for( i = 0; i < len; ++i) |
72
73 |
(ret[i] =='' ) |
74
75 |
ret[i] =76 |
77 |
78 |
79 |
} |
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!