ddz.GlobalFuncs.DownloadImg( picName, 'games/ddz/img/nopack/medal/', this, this.onFinishDownPic, {'sprite' : cell['_rewardpic'], 'size' : picSize} );
其中的picName就是个存放图片的url,games/ddz/img/nopack/medal/是下载到手机上的路径, this.onFinishDownPic是下载完图片的回调函数,{'sprite' : cell['_rewardpic'], 'size' : picSize}是传递给onFinishDownPic的参数(其中cell["_rewardpic"]是一个精灵,picSize是精灵的contentsize)
自定义的回调函数:
onFinishDownPic:function(obj, params){
var sprite = params['sprite'];
var size = params['size'];
var texture = cc.TextureCache.getInstance().addImage(obj["path"]);
// var size = texture.getContentSize();// 使用下载下来的图片的尺寸,或是之前从params中获得的精灵的尺寸
sprite.setTexture(texture);
sprite.setTextureRect(cc.rect(0,0,size.width,size.height));
}
下载的函数为:
ddz.GlobalFuncs.DownloadImg = function(url, filePath, cobj, callback, params) {
if( url.indexOf('http') < 0 ){// 如果传入的url中没有带http头
cc.log('Invalid url to download, return!!!!!!');
return;
}
var fu = cc.FileUtils.getInstance();
var path = fu.getWritablePath() + filePath;// 拼凑出下载后的图片将要存放的手机本地路径,本例为/Users/zhang/Library/Application Support/iPhone Simulator/6.0/Applications/AB0A1B59-B303-4F17-8C6C-AD41E0F438F7/Documents/games/ddz/img/nopack/medal
if (!ty.FileManager.checkFileExist(path)) { //检查文件夹是否存在,如果不存在,则创建(ty._FileManager是ty._FileManager类的一个对象,ty._FileManager类见下)
ty.FileManager.createDir(path);
}
var fileName = ty.Util.md5HashPicUrl(url);// 用md5对下载的图片的文件名进行加密,加密方法如需了解去网上搜索
path += fileName;
if (fu.isFileExist(path)) {// 如果存在就直接去调用下载后的回调函数
// cc.log("file exists, call back");
callback.call(cobj, {
"statusCode": 200,
"path": path,
"openErr": 0,
"writeErr": 0
}, params);
} else {// 如果不存在就去网上下载
ty.Util.downloadAndLoadImg(url, ['Content-Type: image/png; charset=utf-8','Content-Type: image/jpg; charset=utf-8'], path, cobj, callback, params);
}
};
// 通过url下载一张图,下载完之后回调出去,回调的参数里面带了下载文件保存的路径
// 参数依次是url地址,http的头部信息,fullFilePath为绝对路径,回调的对象,回调的函数,传给回调函数的参数
//如果cbObj会被销毁,则要在销毁时调用下面的removeDownloadCallObj方法,防止回调已经被销毁的对象
downloadAndLoadImg: function(url, headArr, fullFileName, cbObj, cb, parameters) {
this.__util.httpDownloadImageAsyncCallbackObj =this.__util.httpDownloadImageAsyncCallbackObj || {};
var all = {
obj: cbObj,
callback: cb,
params: parameters
};
var imgObjs = this.__util.httpDownloadImageAsyncCallbackObj;// 是个空对象
imgObjs[fullFileName] = all; // 内部会转为writable的,此时不为空了
this.__util.onHttpRequestCompleted = this.onHttpRequestCompleted;
this.__util.httpDownloadImg(url, headArr, fullFileName);
},
this.__util是个用spridemonkey绑定的c++对象
其中httpDownloadImg方法对应的c++代码为:
void downloadAndLoadImg(string url,string path,CCArray * headerArr)
{
CCHttpRequest* request =newCCHttpRequest();
request->setUrl(url.c_str());
// get的方式
request->setRequestType(CCHttpRequest::kHttpGet);
if (headerArr != NULL)
{
// 设置http的头部信息
std::vector<std::string> headers;
CCObject *pElement = NULL;
CCARRAY_FOREACH(headerArr, pElement)
{
CCString *headerStr = (CCString*)pElement;
headers.push_back(headerStr->getCString());
}
request->setHeaders(headers);
}
request->setTag(path.c_str());//借用tag来传递path
// 设置cpp回调
request->setResponseCallback(httpDownloadCB,httpresponse_selector(HttpdownloadAndLoadImgCallBackWrapper::onHttpRequestCompleted));
CCHttpClient::getInstance()->send(request);
request->release();
}
ty._FileManager = cc.Class.extend({
// 除了资源文件因为资源在包内,没有路径,其余文件操作都使用绝对路径
// 操作前用getWritableRootPath获取根路径进行拼接
ctor: function() {
cc.log("in FileManager ctor");
this.fileManager = new TY_FILE_MANAGER;
},
//读取资源文件,android存放在assets中,ios在nsbundle中
readFromResource: function(path) {
var str = this.fileManager.readFromResource(path);
return str;
},
//获取可写路径的根路径, bSdcard用来设定android设备是否获取sd卡根路径
getWritableRootPath: function(bSdcard) {
if (bSdcard == undefined) {
bSdcard = false;
}
var str = this.fileManager.getWritableRootPath(bSdcard);
return str;
},
//检测剩余容量,返回单位MB
getAvailablelCapacity: function(bSdcard) {
if (bSdcard == undefined) {
bSdcard = false;
}
var size = this.fileManager.getAvailablelCapacity(bSdcard);
cc.log("get available capacity: " + size.toString());
return size;
},
//创建文件夹
//dir必须是绝对路径,调用前先获取根路径拼成绝对路径
createDir: function(dir) {
var code = this.fileManager.createDir(dir);
},
//创建空文件,如果路径不存在,会创建失败
//dir必须是绝对路径,调用前先获取根路径拼成绝对路径
createFile: function(filePath) {
var li = filePath.lastIndexOf('/');
var dir = filePath.substr(0, li);
if(!this.checkFileExist(dir)) {
this.createDir(dir);
}
var code = this.fileManager.createFile(filePath);
},
//检查文件或者目录是否存在
//path为绝对路径
checkFileExist: function(path) {
var bFileExist = this.fileManager.checkFileExist(path);
return bFileExist;
},
//读取文本文件,path为绝对路径
readFile: function(path) {
var str = this.fileManager.readFile(path);
return str;
},
//写入文本文件, sFile为绝对路径, bAppend指是否从文件尾添加,不设置的话如果原文件有内容,默认清空原文件
writeFile: function(sFile, sContent, bAppend) {
var bSuccess = this.fileManager.writeFile(sFile, sContent, bAppend);
return bSuccess;
},
//判断一个路径是否是文件夹,路径为绝对路径
isDirectory: function(path) {
var bid = this.fileManager.isDirectory(path);
return bid;
},
//获取文件或者文件夹的大小,路径为绝对路径
getFileSize: function(path) {
var lsize = this.fileManager.getFileSize(path);
return lsize;
},
//删除文件和文件夹,如果文件夹非空也会进行删除
deleteFile: function(path) {
var bsuccess = this.fileManager.deleteFile(path);
return bsuccess;
},
//获取文件夹下的所有文件列表(包括文件夹)
listSubFiles: function(path) {
var lists = this.fileManager.listSubFiles(path);
return lists;
},
});
TY_FILE_MANAGER使用spridemonkey进行绑定的
// jsb_file_manager.h
#ifndef Game_jsb_file_manager_h
#define Game_jsb_file_manager_h
#include "jsapi.h"
#include "jsfriendapi.h"
// 处理文件管理的手动绑定
void register_jsb_file_manager(JSContext* cx,JSObject* global);
#endif
// jsb_file_manager.cpp
#include "jsb_file_manager.h"
#include "cocos2d.h"
#include "cocos2d_specifics.hpp"
#include "FileManager.h"
using namespace tuyoo;
JSClass *js_tuyoo_file_manager_class;
JSObject *js_tuyoo_file_manager_prototype;
JSBool js_tuyoo_file_manager_readFromResource(JSContext *cx,uint32_t argc,jsval *vp){
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
std::string str;
cobj->readFromResource(fileName, str);
jsval strval = std_string_to_jsval(cx, str);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_getAvailablelCapacity(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_BOOLEAN(argv[0])){
JSBool bFromSdcard = JSVAL_TO_BOOLEAN(argv[0]);
double size = cobj->getAvailablelCapacity(bFromSdcard);
jsval sizevar = DOUBLE_TO_JSVAL(size);
JS_SET_RVAL(cx, vp, sizevar);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_createDir(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string path;
jsval_to_std_string(cx, argv[0], &path);
bool bSuccess = cobj->createDir(path);
jsval codevar = BOOLEAN_TO_JSVAL(bSuccess);
JS_SET_RVAL(cx, vp, codevar);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_createFile(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string path;
jsval_to_std_string(cx, argv[0], &path);
bool bSuccess = cobj->createFile(path);
jsval codevar = BOOLEAN_TO_JSVAL(bSuccess);
JS_SET_RVAL(cx, vp, codevar);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_checkFileExist(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
bool fe = cobj->checkFileExist(fileName);
jsval strval = BOOLEAN_TO_JSVAL(fe);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_isDirectory(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
bool fe = cobj->isDirectory(fileName);
jsval strval = BOOLEAN_TO_JSVAL(fe);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_getFileSize(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
long fsize = cobj->getFileSize(fileName);
jsval strval = DOUBLE_TO_JSVAL(fsize);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_deleteFile(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
bool bsuccess = cobj->deleteFile(fileName);
jsval strval = BOOLEAN_TO_JSVAL(bsuccess);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_getWritablePath(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_BOOLEAN(argv[0])){
JSBool bFromSdcard = JSVAL_TO_BOOLEAN(argv[0]);
std::string str = cobj->getWritablePath(bFromSdcard);
jsval strval = std_string_to_jsval(cx, str);
JS_SET_RVAL(cx, vp, strval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_writeFile(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc >= 2 && argc <=4){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0]) &&JSVAL_IS_STRING(argv[1])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
std::string content;
jsval_to_std_string(cx, argv[1], &content);
bool bAppend = false;
if (argc >= 3 &&JSVAL_IS_BOOLEAN(argv[2])) {
bAppend = JSVAL_TO_BOOLEAN(argv[2]);
}
bool bTruncate = false;
if (argc == 4 &&JSVAL_IS_BOOLEAN(argv[3])) {
bTruncate = JSVAL_TO_BOOLEAN(argv[3]);
}
bool bSuccess = cobj->writeFile(fileName, content, bAppend);
jsval bsval = BOOLEAN_TO_JSVAL(bSuccess);
JS_SET_RVAL(cx, vp, bsval);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d - %d", argc,2,4);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_readFile(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
std::string content;
cobj->readFile(fileName, content);
jsval cvar = std_string_to_jsval(cx, content);
JS_SET_RVAL(cx, vp, cvar);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
JSBool js_tuyoo_file_manager_listSubFiles(JSContext *cx,uint32_t argc,jsval *vp) {
FileManager * cobj = FileManager::getInstance();
JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");
if(argc == 1){
jsval *argv = JS_ARGV(cx, vp);
if (JSVAL_IS_STRING(argv[0])){
std::string fileName;
jsval_to_std_string(cx, argv[0], &fileName);
CCArray* arr = CCArray::createWithCapacity(3);
cobj->listSubFiles(fileName, arr);
jsval cvar = ccarray_to_jsval(cx, arr);
JS_SET_RVAL(cx, vp, cvar);
return JS_TRUE;
}
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,1);
returnJS_TRUE;
}
// 虚拟机垃圾回收时的回调函数,第一个参数代表runtime,第二个是被垃圾回收的js对象
void js_tuyoo_file_manager_finalize(JSFreeOp *fop,JSObject *obj) {
CCLOG("jsbindings: finalizing JS object %p (TY_FILE_MANAGER)", obj);
}
JSBool js_tuyoo_file_manager_constructor(JSContext *cx,uint32_t argc,jsval *vp)
{
jsval *argv = JS_ARGV(cx, vp);
if (argc == 0)
{
// js对象
JSObject *obj = JS_NewObject(cx, js_tuyoo_file_manager_class,js_tuyoo_file_manager_prototype,NULL);
FileManager * cobj = FileManager::getInstance();
// 将native的和js的对象做个双向map
js_proxy_t *p = jsb_new_proxy(cobj, obj);
// 使用的对象是 TY_FILE_MANAGER
JS_AddNamedObjectRoot(cx, &p->obj,"TY_FILE_MANAGER");
// 设置JS构造函数的返回值为obj
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
return JS_TRUE;
}
JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,0);
returnJS_FALSE;
}
// 入口
void register_jsb_file_manager(JSContext *cx,JSObject *global) {
js_tuyoo_file_manager_class = (JSClass *)calloc(1,sizeof(JSClass));
js_tuyoo_file_manager_class->name ="TY_FILE_MANAGER";
js_tuyoo_file_manager_class->addProperty =JS_PropertyStub;
js_tuyoo_file_manager_class->delProperty =JS_PropertyStub;
js_tuyoo_file_manager_class->getProperty =JS_PropertyStub;
js_tuyoo_file_manager_class->setProperty =JS_StrictPropertyStub;
js_tuyoo_file_manager_class->enumerate =JS_EnumerateStub;
js_tuyoo_file_manager_class->resolve =JS_ResolveStub;
js_tuyoo_file_manager_class->convert =JS_ConvertStub;
js_tuyoo_file_manager_class->finalize =js_tuyoo_file_manager_finalize;
js_tuyoo_file_manager_class->flags =JSCLASS_HAS_RESERVED_SLOTS(2);
// 要注册的属性
static JSPropertySpec properties[] = {
// 脚本层自己通过回调来设定当前的连接状态,这里就不设置了
// {"curState", 0, JSPROP_ENUMERATE | JSPROP_PERMANENT | JSPROP_SHARED, JSOP_WRAPPER(js_tuyoo_TCPSocket_get_curState), NULL},
{0, 0, 0, 0, 0}
};
// 实例函数
static JSFunctionSpec funcs[] = {
JS_FN("readFromResource", js_tuyoo_file_manager_readFromResource,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("getWritableRootPath", js_tuyoo_file_manager_getWritablePath,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("getAvailablelCapacity", js_tuyoo_file_manager_getAvailablelCapacity,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("createDir", js_tuyoo_file_manager_createDir,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("createFile", js_tuyoo_file_manager_createFile,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("checkFileExist", js_tuyoo_file_manager_checkFileExist,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("writeFile", js_tuyoo_file_manager_writeFile,4,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("readFile", js_tuyoo_file_manager_readFile,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("isDirectory", js_tuyoo_file_manager_isDirectory,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("getFileSize", js_tuyoo_file_manager_getFileSize,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("deleteFile", js_tuyoo_file_manager_deleteFile,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FN("listSubFiles", js_tuyoo_file_manager_listSubFiles,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),
JS_FS_END
};
// 类函数
static JSFunctionSpec st_funcs[] = {
JS_FS_END
};
js_tuyoo_file_manager_prototype =JS_InitClass(
cx, global,
NULL,
js_tuyoo_file_manager_class, // 虚拟机内的JSClass类
js_tuyoo_file_manager_constructor, 0, // 构造函数
properties,
funcs,
NULL, // no static properties
st_funcs);
// 这个对应一个js的构造函数,在js中使用 new TY_VOICE_RECORDER()的方式来使用这个native的类
JSObject* jsclassObj =JSVAL_TO_OBJECT(anonEvaluate(cx, global,"(function () { return TY_FILE_MANAGER; })()"));
// 注册到全局变量中
JSBool found;
JS_SetPropertyAttributes(cx, global, "TY_FILE_MANAGER", JSPROP_ENUMERATE | JSPROP_READONLY, &found);
}
AppDelegate.cpp中
#include "jsb_file_manager.h"
ScriptingCore* sc = ScriptingCore::getInstance();// 其中ScriptingCore是cocos2dx-js/bindings/下的一个类
sc->addRegisterCallback(register_jsb_file_manager);
可见上面绑定的类是
FileManager
// FileManager.h
#ifndef FILEMANAGER_H
#define FILEMANAGER_H
#include "cocoa/CCArray.h"
namespace tuyoo {
class FileManager
{
public:
virtual ~FileManager(); // 析构函数
FileManager(const FileManager &ano); // 拷贝构造函数
FileManager & operator = (constFileManager &ano);//赋值运算符
static FileManager * getInstance();
void readFromResource(conststd::string& fileName,std::string& str);
std::string getWritablePath(bool bFromSdcard);
double getAvailablelCapacity(bool bFromSdcard);
bool createDir(conststd::string& dir);
bool createFile(conststd::string& filePath);
bool checkFileExist(conststd::string& path);
bool writeFile(conststd::string& fileName,conststd::string& content,bool bAppend);
void readFile(conststd::string& fileName,std::string& content);
bool isDirectory(conststd::string& dir);
long getFileSize(conststd::string& dir);
bool deleteFile(conststd::string& fileName);
void listSubFiles(conststd::string& path,cocos2d::CCArray* array);
void readBinaryFile(conststd::string& fileName,char* data,int size);
bool writeBinaryFile(conststd::string& fileName,char*data);
void copyFile();
private: //成员变量
FileManager();
};
}
#endif
// FileManager.mm
#include "FileManager.h"
#include <sys/stat.h>
#include <stdlib.h>
#include <fstream>
#include "FileManagerCppAdapter.h"
#include "cocos2d.h"
using namespace std;
using namespace cocos2d;
using namespace tuyoo;
FileManager * FileManager::getInstance()
{
static FileManager s_instance;
return &s_instance;
}
FileManager::FileManager()
{
// 初始化代码
}
FileManager::~FileManager()
{
// 析构函数
}
void FileManager::readFromResource(conststd::string& filePath,std::string& str) {
size_t spos = filePath.rfind('/');
NSString* subdir = NULL;
string fileName = filePath;
if (spos > 0 && spos !=string::npos) {
subdir = [NSString stringWithUTF8String:filePath.substr(0, spos).c_str()];
fileName = filePath.substr(spos + 1);
}
size_t ppos = fileName.find('.');
if (ppos <= 0 || ppos ==string::npos) {
return;
}
NSString* fn = [NSStringstringWithUTF8String:fileName.substr(0, ppos).c_str()];
NSString* ft = [NSStringstringWithUTF8String:fileName.substr(ppos +1).c_str()];
NSString *fpstr = [[NSBundlemainBundle]pathForResource:fnofType:ftinDirectory:subdir];
NSString* content = [NSStringstringWithContentsOfFile:fpstrencoding:NSUTF8StringEncodingerror:NULL];
str = string([content UTF8String]);
}
std::string FileManager:: getWritablePath(bool bFromSdcard) {
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return std::string([documentsDirectoryUTF8String]);
}
double FileManager::getAvailablelCapacity(bool bFromSdcard) {
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSDictionary* dic = [[NSFileManagerdefaultManager]attributesOfFileSystemForPath:documentsDirectoryerror:NULL];
// NSNumber *fileSystemSizeInBytes = [dic objectForKey: NSFileSystemSize];
NSNumber *freeFileSystemSizeInBytes = [dicobjectForKey:NSFileSystemFreeSize];
return [freeFileSystemSizeInBytes longLongValue] / (1024 * 1024);
}
bool FileManager::createDir(conststd::string& dir) {
if (checkFileExist(dir)) {
return true;
}
NSString* filePath = [NSStringstringWithUTF8String:dir.c_str()];
bool bSuccess = [[NSFileManagerdefaultManager]createDirectoryAtPath:filePath
withIntermediateDirectories:YES
attributes:nil
error:NULL];
return bSuccess;
}
bool FileManager::createFile(conststd::string& filePath) {
if (checkFileExist(filePath)) {
return true;
}
NSString* fp = [NSStringstringWithUTF8String:filePath.c_str()];
return [[NSFileManagerdefaultManager]createFileAtPath:fpcontents:NULLattributes:NULL];
}
bool FileManager::checkFileExist(conststd::string& path) {
returnFileManagerCppAdapter::getInstance()->checkFileExist(path);
}
bool FileManager::writeFile(conststd::string& fileName,conststd::string& content,bool bAppend) {
return FileManagerCppAdapter::getInstance()->writeFile(fileName, content, bAppend);
}
void FileManager::readFile(conststd::string& fileName,std::string& content) {
FileManagerCppAdapter::getInstance()->readFile(fileName, content);
}
void FileManager::readBinaryFile(conststd::string &fileName,char *data,int size) {
FileManagerCppAdapter::getInstance()->readBinaryFile(fileName, data, size);
}
bool FileManager::writeBinaryFile(conststd::string &fileName,char *data) {
return FileManagerCppAdapter::getInstance()->writeBinaryFile(fileName, data);
}
bool FileManager::isDirectory(conststd::string& dir) {
returnFileManagerCppAdapter::getInstance()->isDirectory(dir);
}
long FileManager::getFileSize(conststd::string& dir) {
returnFileManagerCppAdapter::getInstance()->getFileSize(dir);
}
bool FileManager::deleteFile(conststd::string& fileName) {
NSString* filePath = [NSStringstringWithUTF8String:fileName.c_str()];
return [[NSFileManagerdefaultManager]removeItemAtPath:filePatherror:NULL];
}
void FileManager::listSubFiles(conststd::string& path,cocos2d::CCArray* array) {
if (checkFileExist(path) &&isDirectory(path)) {
NSString* filePath = [NSStringstringWithUTF8String:path.c_str()];
NSArray *subpaths = [[NSFileManagerdefaultManager]subpathsAtPath:filePath];
int index = 0;
for (NSString* pin subpaths) {
CCString* cs = new CCString([p UTF8String]);
array->insertObject(cs, index);
index++;
cs->release();
}
}
}