根据一个url从网上下载图片

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中,iosnsbundle

  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();

        }

    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值