cocos2dx中加入unzip
作者:HU
转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037323.html
cocos2dx中没有直接解压文件的,自己网上找了个,记录一下。
static unsigned long _maxUnzipBufSize = 0x500000;
static bool unzip(const char *zipPath,const char *dirpath,const char *passwd)
{
CCLOG("unzip fullpath =%s",zipPath);
unzFile pFile = unzOpen(zipPath);
if(!pFile)
{
return false;
}
int err = unzGoToFirstFile(pFile);
bool ret = true;
while (err == UNZ_OK)
{
int nRet = ;
int openRet = ;
do
{
if(passwd)
{
openRet = unzOpenCurrentFilePassword( pFile,passwd);
CCLOG("openRet %d",openRet);
}
else
{
openRet = unzOpenCurrentFile(pFile);
}
CC_BREAK_IF(UNZ_OK != openRet);
unz_file_info FileInfo;
char szFilePathA[];
nRet = unzGetCurrentFileInfo(pFile, &FileInfo, szFilePathA, sizeof(szFilePathA), NULL, , NULL, );
CC_BREAK_IF(UNZ_OK != nRet);
//如果szFilePathA为中文的话,请使用iocnv转码后再使用。
std::string newName = std::string(dirpath)+"/"+szFilePathA;
if (newName[newName.length()-]=='/')
{
FileUtils::getInstance()->createDir(newName.c_str());
continue;
} FILE* pFile2 = fopen(newName.c_str(), "w");
if (pFile2)
{
fclose(pFile2);
}
else
{
CCLOG("unzip can not create file");
return false;
}
unsigned long savedSize = ;
while(pFile2 != NULL && FileInfo.uncompressed_size > savedSize)
{
unsigned char *pBuffer = NULL;
unsigned long once = FileInfo.uncompressed_size - savedSize;
if(once > _maxUnzipBufSize)
{
once = _maxUnzipBufSize;
pBuffer = new unsigned char[once];
}
else
{
pBuffer = new unsigned char[once];
}
int nSize = unzReadCurrentFile(pFile, pBuffer, once);
fwrite(pBuffer, once, , pFile2); savedSize += nSize;
delete []pBuffer;
}
if (pFile2)
{
fclose(pFile2);
} } while ();
if(nRet != UNZ_OK)
{
ret = false;
}
else
{
unzCloseCurrentFile(pFile);
}
err = unzGoToNextFile(pFile);
} if(err != UNZ_END_OF_LIST_OF_FILE)
{
ret = false;
}
unzClose(pFile);
return ret;
}
这个方法 压缩文件中不能有中文文件名的文件,因为中文在window下zip后里面的中文是用的gb2312编码,而IOS中用的是utf8格式,这时unzip时文件名会出错,导致解压失败。
如果非得一定要使用的话,要使用iconv库进行转码。具体使用方法请参考http://www.cnblogs.com/hewei2012/p/3374147.html
创建目录的方法:在FileUtils中加个方法
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#endif void FileUtils::createDir(const char* p)
{
std::string path = p;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32) mode_t processMask = umask();
int ret = false; ret = mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
umask(processMask);
if (ret != && (errno != EEXIST))
{
CCLOG("create dir fail");
} #else
BOOL ret = false; ret = CreateDirectoryA(path.c_str(), NULL);
if (!ret && ERROR_ALREADY_EXISTS != GetLastError())
{
CCLOG("create dir fail");
}
#endif
}
cocos2dx中加入unzip的更多相关文章
- Cocos2dx中线程优先级
Cocos2dx中线程优先级问题 不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈.游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术. 一.弱联网技术介绍 在网络游戏中许多重要的功能都需要网络连接,而根据需 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术
一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...
- cocos2dx 中使用的一些C++ 11 特性
0. placeholder 头文件:<functional> namespace: placeholder placeholder 就是一堆帮助bind占参数位置的东西,名字分别为 _ ...
- cocos2dx中CC_CALLBACK_1等宏中this指针实际指向
首先看代码,我在Helloworld中添加两个函数. void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()- ...
- cocos2d-x 中的坐标系
cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...
- cocos2d-x 中的基本概念
在 cocos2d-x 开头配置(Windows 平台)中,介绍了新建工程,这篇就介绍下 cocos2d-x 的一些概念.(前提是需要有C++的面向对象的基本知识和C++11的常用知识) 层,场景,导 ...
- WP8:在Cocos2d-x中使用OpenXLive
一. Cocos2d-x for Windows Phone 到2013年底,几大手游引擎都陆续支持WP8了,特别是Unity3D和Cocos2d-x.有过游戏开发经验的朋友们应该对这两个引擎不 ...
- Cocos2dx中零散知识点
cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce.功能分别是 每隔几秒调用自定义函数.调用系统默认的update()函数.只调用一次自定义函数 ...
随机推荐
- nodejs模拟http-post文件的方法示例
var fs = require("fs"); var http = require('http'); function PostFileToServer(sFileName, d ...
- [Papers]NSE, $u$, Lorentz space [Bosia-Pata-Robinson, JMFM, 2014]
$$\bex \bbu\in L^p(0,T;L^{q,\infty}),\quad \frac{2}{p}+\frac{3}{q}=1,\quad 3<q\leq\infty. \eex$$ ...
- 5、NFC概述
什么是NFC NFC(Near Field Communication,近场通信),是一种数据传输技术.但与Wi-Fi.蓝牙.红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4厘米. NFC ...
- python2.7系列安装失败的办法
在windows系统上安装python时出现"there is a problem with your Windows installer package. A program run as ...
- js document对象
document对象可以通过多种方式获取: 最常见的一种情况是,你在文档的script脚本中直接使用document,这个document代表运行着该脚本的文档.(这个document和window. ...
- sqoop 初用
http://blog.csdn.net/dbanote/article/details/8907650 目前版本的Sqoop中,使用自由形式查询导入,只提供简单的查询,没有复杂的和“OR”条件查询在 ...
- leetcode—jump game
1.题目描述 Given an array of non-negative integers, you are initially positioned at the first index of t ...
- ubuntu下apt-get update出现hash校验和错误
可能原因 校园网进行网络缓存导致内容滞后. 解决办法 先清除旧的apt-get更新列表 sudo rm -rf /var/lib/apt/lists/* 使用代理服务器或者VPN 重新更新 sudo ...
- MS-queue算法相关
简介: 多核多线程已经成为当下一个时髦的话题,而无锁编程更是这个时髦话题中的热点话题.Linux 内核可能是当今最大最复杂的并行程序之一,为我们分析多核多线程提供了绝佳的范例.内核设计者已经将最新的无 ...
- 解决SQL Server Always 日志增大的问题-摘自网络
配置了Alwayson之后,因为没有只能使用完全恢复模式,不能使用简单或大容量日志模式,所以日志不断增长,不能使用改变恢复模式的方式清空日志 手动操作收缩或截断日志也无效 读了一些文章后发现,有人使用 ...