。
简介
我已经介绍了在{A} XZip。本文介绍XZip也XUnzip,这允许您添加ZIP解压缩到您的应用程序,而不使用任何的。lib或。dll。
首先,让我承认
的工作和生产的。cpp和。h文件是基于XZip。XZip和XUnzip特点
的大部分功能都体现在XZip演示程序。下面是主要的:CreateZip() - 创建一个zip归档文件。 ZipAdd() - 将文件添加到一个zip档案。{C}OpenZip() - 打开一个现有的ZIP归档文件。
XZip融入你的应用程序,你首先需要添加下列文件到您的项目:XZip.cppXZip.hXUnzip.cppXUnzip.h
,如果包括在一个项目中使用预编译头XZip,你必须改变的C / C预编译头设置XZip.cpp和XUnzip.cpp不使用预编译头。
接下来,包含头文件XZip.h在适当的项目文件和XUnzip.h。现在,你准备好开始使用XZip。有许多笔记关于使用XZip.h和XUnzip.h各种功能。为每个你想使用的功能,请仔细阅读所有的功能头。已知的限制XZip和XUnzip已经过测试,只能用文件。演示程序
XZipTest.exe演示测试XZip和XUnzip的API。下面是一些输出:
{S0}常见问题我可以在非MFC应用程序中使用XZip吗?
是。已实施任何Win32程序编译。当我尝试包括在我的MFC项目XZip.cpp的,我得到的编译器错误XZip.cpp(2918):致命错误C1010:意外的文件结尾,同时寻找预编译头指令。我怎样才能解决这个问题?
当使用项目,使用预编译头XZip,你必须改变的C / C预编译头设置XZip.cpp和XUnzip.cpp不使用预编译头。一定要做好所有配置。
当我尝试建立的演示程序,我得到的链接错误链接:致命错误LNK1104:无法打开文件quot; mfc42u.libquot;错误执行LINK.EXE。我怎样才能解决这个问题?
的Visual C V6.0的默认安装选项不安装的MFC Unicode库,所以你可能会得到mfc42u.lib或mfc42ud.lib无法找到的错误。您可以从VC的安装光盘安装的Unicode库,或要建立修复|设置主动配置和选择非Unicode的配置之一。
{S2}
您可以配置Visual Studio的工具栏包括选择主动配置组合框。这使您可以看到您正在使用什么样的配置一目了然。我不需要压缩/解压缩功能。我能排除XZip.cpp / XUnzip.cpp吗?
是。你只需要包括您需要的.h / .cpp对。我们可以使用(共享软件/商业)APP XZip?
是的,你可以使用无费或许可费XZip,提供您按照XZip.cpp定义的Info - ZIP的限制。XZip处理管吗?在内存压缩?
XZip尚未比文件的任何其他测试。我可以使用在VS2005项目XZip吗?
是。有一个示例VS2005的项目包括在下载。XZip Vista上的工作?
是。致谢 XZip.cpp和XUnzip.cpp代码包含
许可。请参阅Info - ZIP的版权和限制XZip.cpp。CXListBox类是从我自己的文章中,{A4纸}。修订历史版本1.3 - 2007年7月18日文件大小固定的问题,是16384多个,马蒂亚斯斯文森报告。固定XZip,保存在本地时间文件的时间,建议由达米尔Valiulin。版本1.2 - 2007年6月30日增加了对VS2005的项目。添加AddFolderContent()雷诺Deysine贡献。 与TUnzip固定的问题:打开()由皮特豪厄尔斯。现在的Open()返回正确的成功代码。沃伦史蒂文斯报告修正了几个错误。 修正了一个问题,在unzReadCurrentFile()Kochise报道。固定的臭虫在EnsureDirectory()craigmj报道。建议由Michael B.汉森改变ideflate()。time_t的固定问题的报告Ronney。沃伦史蒂文斯固定的BoundsChecker发现的问题报告。PUTSHORT和PUTBYTE宏和TZip:写(),vielheit建议。版本1.1 - 2003年5月7日首次公开发行使用
本软件发布到公共领域。您可以自由使用任何你喜欢的方式,但你可以不卖这个源代码。如果您对其进行修改或扩展,请考虑张贴新的代码,在这里,供大家分享。这个软件是quot;作为isquot;没有明示或暗示保证。我接受业务,该软件可能导致的任何损害或损失不承担任何责任。
中国
目前该库的建设_UNICODE的定义和使用的版本
bug的代码是在XZip.cpp ZipAdd (...){ BR}
解决方案
修复bug的代码应该简化这个XZip.cpp ZipAdd (...)
1。检查无效dstzn参数
2。取出的if / else总是转换的文件名,不管flags参数
值
修改10月19日'11
试图使用ZIP_FOLDER CreateZip,但始终有一个错误返回{BR。 }
我试图收拾几个文件夹之下成一个zip文件的文件下一个指定的目录
任何人都可以阐明如何做一个光
? BR}感谢和问候,
柯
修改日(星期二),2011年8月23日下午08:03
最近,我注意到,打开一个现有的zip文件报告"UNZ_BADZIPFILE"时,文件的大小大于2GB。为了解决这个问题,我做了很多改变我的代码副本,但它们可以被归纳为有兴趣的人(基本的问题是使用的变量是太小)如下:
- 改变所有的"无符号长"变量"无符号的__int64"(见unz_global_info,unz_file_info)
- 改变"ULONG"的定义,从"无符号长"的"无符号的__int64"(我刚刚摆脱"ULONG",取代它)
。 - 改变了几个"无符号整型"的"无符号的__int64"(特别是LUFILE结构的成员)
变量。 - 取代SetFilePointerEx()SetFilePointer(),这样您就可以使用的无符号的__int64值
。
例如更换的SetFilePointer()这是在"lufseek()"函数:
我做了有限的测试显示,它的作品,即我现在可以成功地从一个zip文件,大于2GB检索一个条目上市。
希望这有助于,
- 彼得
主人的第四Ray软件
fourthray.com
最美好的祝愿,
汉斯
我在xunzip.cpp unzLocateFile添加2行代码,使解压缩文件更容易
添加以上现在将允许或调用了领先的斜线。
FindZipItem因此,例如,以下所有工程
FindZipItem(HJ,"icon.png",0,IDX,ZE)
FindZipItem(HJ / icon.png",IDX,泽0)
FindZipItem(HJ,"/ res/image2d/icon.png",0,IDX,ZE)
FindZipItem(HJ,"META-INF/MANIFEST.MF",0,IDX,ZE)
FindZipItem(HJ / META-INF/MANIFEST.MF",0,IDX,ZE)
我知道人们阅读这些网页LOL
来吧发表一些意见,甚至更好一些改进
的
有人智能需要更新这个类允许更新现有的拉链,将凉
问题不在于更新类的愿望,但惹的事实,即原来的代码是这样一个可怕的意大利面条,几乎任何变化将打破别的东西。 {五}
最美好的祝愿,
汉斯
[
,
牢记这是没有2号线的Hello World例子
的
我不在乎其他人说什么..
其令人印象深刻,我很欣赏的努力投入此代码!
我再次发布,因为IM与挣扎的解压缩到内存ZR_MORE错误
其驾驶我坚果,我仍然不能真正看到出问题。
因为IM意识到这个问题,我可以解决此问题,但IM仍然
寻找适当的修复..
我继续运行通过unzReadCurrentFile与Visual Studio调试器
想看看为什么重新调用Unzipitem再次fixs的问题..
这是我干了什么.. (LEN = 1通知第二解压调用ZR_OK设置)
东西显然是打破unzReadCurrentFile,必须有一个妥善的解决办法?
和解决方案,将工作ZIP_MEMORY ZIP_FILENAME等
。没有带测试这个有很多,但到目前为止,似乎OK ..
首先,我所做的更改,因为,因为我没有工作喜欢的方式AddFolderContent。
我所做的是改变它的名字的。zip
中的内容BOOL AddFolderContent(HZIP hZip,TCHAR * AbsolutePath,TCHAR * DirToAdd)
normaly DirToAdd成zip文件,并添加,以及它的全部内容。
所以我想要的东西是添加的内容和目录结构的ZIP 出来加入到选定的DirToAdd文件夹的zip。
所以这以外的DirAdd文件夹中会做同样的事情不会被添加到ZIP
另外我之前,我想说感谢您的所有贡献者进行,我很欣赏的所有努力的人!
所以这里是我的变化后的完整功能(注:使用率保持不变)
我拿出一些日志代码,如果有人想知道为什么我添加了这么多的括号?
两个问题:
1。你运行此代码演示测试?
我还没有机会看看这个详细,但我将发布您的版本 - 你与信贷 - 如果你想我。这是可以接受的吗?如果有的话,请送我用您的更改压缩的完整的项目(不包括EXE)。请您认为合适的任何修改文件头。拉链我的Gmail点com。hdietrich
最美好的祝愿,
汉斯
[
但IM一个35yr老家伙喜欢上项目的工作作为一种业余爱好
和IM为LG手机的黑客工具,并使用该zip
代码。jar文件中提取文件写入。我的工具重建一个databse
LG手机中添加应用程序的目的和格式化内容。
昨晚我做了一个关于在Zip头
所述的主机操作系统搜索位和我改变了我的代码,模仿相同的操作系统版本作为一个zip用winrar报告时。
我认为这可能是有趣的一个#define或东西头,编码器可以
选择主机/版本,他希望在他的拉链
在TZip:我改变以下,
下面是一个图表,我发现有关此问题上的净..
还林不知道它使得任何反正LOL
的区别
PKZIP主机操作系统表
0 - MS - DOS和OS / 2(发)
1 - Amiga的
2 - VMS的
3 - * nix的
4 - VM / CMS
5 - 雅达利ST
6 - OS / 2 1.2扩展文件系统
7 - 麦金塔
8-255 - 未使用
* /
我做了我自己的源MOD很多年前,我注意到这个代码仍然是目前
beeing阀门公司所使用的。在他们所有的游戏源,但他们使用的是1.0版的代码
只是一个有趣的观察,我想大多数人不会知道。
我强烈建议,警告人们某处的文件,你不能
呼叫OpenZip和具有相同的处理AddZip,我觉得在这个代码的悲哀限制
否则很令人印象深刻的包
代码。
我mod'ing AddFolderContent现在返回书面项目NUM
这种方式可以使用返回的结果来验证邮编创造等
(几乎做到了有probs文件夹计数)
最后,我将尝试运行你的测试代码汉斯,我没想到,好主意(我看到了/我知道你的意思)
并确保病患者做什么,我可以分享我的变化...
,如果我能帮助在所有然后遐
使用这个你必须添加下面一行XZIP.cpp
然后添加= 0 NumFilesAdded;。CloseZipZ如下所示:
然后改变我粘贴在下面的版本的功能。的变化,从BOOL头返回类型为int。
我创建了一个在我的程序的功能,我演示了如何创建一个文件夹
邮编然后验证的项目数..
终于来了我叫我在我的MFC应用程序的新功能是如何..
!所以我做了速战速决,我想我会分享..在解压缩的行象下面这样的改变,
来自:
H =:的CreateFile((常量TCHAR *)DST,GENERIC_WRITE,0,NULL,则CREATE_ALWAYS,ze.attr,NULL);
到:
H =:的CreateFile((常量TCHAR *)DST,GENERIC_WRITE,0,NULL,则CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
此外,我不能相信这是另一个压缩类,支持除
几乎所有单个文件添加到现有的zip LOL,只是打击我走!
而只是为了迷惑了每个人的地狱广泛的代码注释deliberatly避免接触受,
让用户张贴在这里,为什么呢?为什么我不能..等可能已经完成的至少是它在页面中添加一个警告,如果它不能在代码中提到的。很抱歉,但真正打勾我,因为我不断发现同样的问题与其他类似拉链项目
这是排在第三,缺少的功能,似乎忘了提..
你不能将文件添加到zip的..除非你创建自己第一个
normaly我staticly链接zlib的,但一个更容易的选择希望..
哦..如果我得到更新zip的工作,我会后我的其他人修复
尝试许多不同的zip文件后,我发现在某些情况下,你会得到什么
但一个空文件没有错误报告..
张贴几年回来的人,你改变以下属性创建,
ze.attr ^ = FILE_ATTRIBUTE_READONLY
现在我还没有测试,但我担心,如果你确实想要一个文件
提取只读其他修复将是不可能的。
现在我不知道非常关注的zip格式,但我没有用WINRAR一个快速的测试..
我做了一个文件的只读和zip'd然后提取到一个新的文件夹,
新创建的/解压缩文件被提取出来保存的只读属性。
我的观点?我认为,修复其他人会打破预期的功能..
所以我做了一些调试跟着做什么xunzip.cpp发生时属性得到
和问题无关读取或设置只读属性(最好的,我可以告诉)
这个问题在下面的代码实际上..
因此,我所做的是改变的代码块,该行发现和
最初修改的行,我发布之前恢复其原来的形式如下所示设置..
下面的代码是什么我基本上改变(TUnzip发现:GET)
这种变化(我删除了uwritable检查)应该有希望解决的文件,beeing创建只读问题
除非他们是假设要提取为只读。
和IM不知道为什么还没有发生这种情况,如果因为某些文件只是缺少UNIX属性,或者如果代码只是interpeting发现的数据不正确?
有人更聪明,要解决这个问题呢?我想看看在下面的调用..
unzlocal_getLong unzlocal_GetCurrentFileInfoInternal调用(文件,功放; S - GT file_info.external_fa)
。最美好的祝愿,
汉斯
这是不对的。据
在DOS美国代码页是使用。你必须使用
CP_OEMCP而不是CP_ACP。
除了(正如我在前面发布)转换为文件和
目录的名称。因此,这是我的固定版本:
注意:此修补程序将只为在DOS美代码页的字符。如果文件名conatain其他Unicode字符
所有的名字必须被转换成UTF - 8和"通用位标志位"11必须设置。 (未实现)
详情请参阅
zfi.vem =(USH)0xB17;
zfi.vem =(USH)20
最美好的祝愿,
汉斯
汉斯迪特里希
babiq
Velja Radenkovic
![](https://i-blog.csdnimg.cn/blog_migrate/502f662235f2448cfc3d4d07f647ddde.png)
我已经介绍了在{A} XZip。本文介绍XZip也XUnzip,这允许您添加ZIP解压缩到您的应用程序,而不使用任何的。lib或。dll。
首先,让我承认
![](https://i-blog.csdnimg.cn/blog_migrate/cdcf221beb4e6ee7b53f8150a739eda7.png)
的大部分功能都体现在XZip演示程序。下面是主要的:CreateZip() - 创建一个zip归档文件。 ZipAdd() - 将文件添加到一个zip档案。{C}OpenZip() - 打开一个现有的ZIP归档文件。
////// // // OpenZip() // // Purpose: Open an existing zip archive file // // Parameters: z - archive file name if flags is ZIP_FILENAME; for // other uses see below // len - for memory (ZIP_MEMORY) should be the buffer size; // for other uses, should be 0 // flags - indicates usage, see below; for files, this will be // ZIP_FILENAME // // Returns: HZIP - non-zero if zip archive opened ok, otherwise 0 //GetZipItem() - 获取有关项目的信息,在一个开放的ZIP存档。
////// // // GetZipItem() // // Purpose: Get information about an item in an open zip archive // // Parameters: hz - handle of open zip archive // index - index number (0 based) of item in zip // ze - pointer to a ZIPENTRY (if ANSI) or ZIPENTRYW struct // (if Unicode) // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //FindZipItem() - 查找项目名称,并返回有关它的信息。
////// // // FindZipItem() // // Purpose: Find item by name and return information about it // // Parameters: hz - handle of open zip archive // name - name of file to look for inside zip archive // ic - TRUE = case insensitive // index - pointer to index number returned, or -1 // ze - pointer to a ZIPENTRY (if ANSI) or ZIPENTRYW struct // (if Unicode) // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //UnzipItem() - 查找索引项目,并把它解压。
////// // // UnzipItem() // // Purpose: Find item by index and unzip it // // Parameters: hz - handle of open zip archive // index - index number of file to unzip // dst - target file name of unzipped file // len - for memory (ZIP_MEMORY. length of buffer; // otherwise 0 // flags - indicates usage, see below; for files, this will be // ZIP_FILENAME // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //CloseZip() - 关闭打开的ZIP存档。
////// // // CloseZip() // // Purpose: Close an open zip archive // // Parameters: hz - handle to an open zip archive // // Returns: ZRESULT - ZR_OK if success, otherwise some other value //如何使用
XZip融入你的应用程序,你首先需要添加下列文件到您的项目:XZip.cppXZip.hXUnzip.cppXUnzip.h
,如果包括在一个项目中使用预编译头XZip,你必须改变的C / C预编译头设置XZip.cpp和XUnzip.cpp不使用预编译头。
接下来,包含头文件XZip.h在适当的项目文件和XUnzip.h。现在,你准备好开始使用XZip。有许多笔记关于使用XZip.h和XUnzip.h各种功能。为每个你想使用的功能,请仔细阅读所有的功能头。已知的限制XZip和XUnzip已经过测试,只能用文件。演示程序
XZipTest.exe演示测试XZip和XUnzip的API。下面是一些输出:
{S0}常见问题我可以在非MFC应用程序中使用XZip吗?
是。已实施任何Win32程序编译。当我尝试包括在我的MFC项目XZip.cpp的,我得到的编译器错误XZip.cpp(2918):致命错误C1010:意外的文件结尾,同时寻找预编译头指令。我怎样才能解决这个问题?
当使用项目,使用预编译头XZip,你必须改变的C / C预编译头设置XZip.cpp和XUnzip.cpp不使用预编译头。一定要做好所有配置。
![](https://i-blog.csdnimg.cn/blog_migrate/6dc61e1f56c0f233b9203f58ca009d80.png)
当我尝试建立的演示程序,我得到的链接错误链接:致命错误LNK1104:无法打开文件quot; mfc42u.libquot;错误执行LINK.EXE。我怎样才能解决这个问题?
的Visual C V6.0的默认安装选项不安装的MFC Unicode库,所以你可能会得到mfc42u.lib或mfc42ud.lib无法找到的错误。您可以从VC的安装光盘安装的Unicode库,或要建立修复|设置主动配置和选择非Unicode的配置之一。
{S2}
您可以配置Visual Studio的工具栏包括选择主动配置组合框。这使您可以看到您正在使用什么样的配置一目了然。我不需要压缩/解压缩功能。我能排除XZip.cpp / XUnzip.cpp吗?
是。你只需要包括您需要的.h / .cpp对。我们可以使用(共享软件/商业)APP XZip?
是的,你可以使用无费或许可费XZip,提供您按照XZip.cpp定义的Info - ZIP的限制。XZip处理管吗?在内存压缩?
XZip尚未比文件的任何其他测试。我可以使用在VS2005项目XZip吗?
是。有一个示例VS2005的项目包括在下载。XZip Vista上的工作?
是。致谢 XZip.cpp和XUnzip.cpp代码包含
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_3.gif)
本软件发布到公共领域。您可以自由使用任何你喜欢的方式,但你可以不卖这个源代码。如果您对其进行修改或扩展,请考虑张贴新的代码,在这里,供大家分享。这个软件是quot;作为isquot;没有明示或暗示保证。我接受业务,该软件可能导致的任何损害或损失不承担任何责任。
关于作者:
汉斯迪特里希
![](http://www.orcode.com/article/img/ico_text7.gif)
![](http://www.orcode.com/img/ico_text8.gif)
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:
戴尔Fugier
时间:2011/11/29
已有很多多年来发布的修复和增强。是否有一个更新的版本,其中包括所有这些修补程序
评论会员:
会员8330357
时间:2011/11/29
错误
目前该库的建设_UNICODE的定义和使用的版本
ZipAdd(zipFile, L"HelloWorld.txt", buffer, sizeof(buffer), ZIP_MEMORY)中,只有第1个字符"H"文件名"HelloWorld.txt"获取存储在ZIP存档中的一个错误的结果,因为投(char *)的dstzn生产的"H \ 0"作为文件名,而不是" HelloWorld.txt \ 0"。的wchar_t的原因是2个字节,因为"H"为2个字节的存储与第1个字节NUL 0x00和第二个字节的"H"0x48和小尾数,它是存储在RAM中的"H \ 0"0x48 0x48投(char *)的为0x00,因此产生一个空终止字符串的"H \ 0"。
bug的代码是在XZip.cpp ZipAdd (...){ BR}
if (flags == ZIP_FILENAME)
{
char szDest[MAX_PATH*2];
memset(szDest, 0, sizeof(szDest));
#ifdef _UNICODE
// need to convert Unicode dest to ANSI
int nActualChars = WideCharToMultiByte(CP_ACP, // code page
0, // performance and mapping flags
(LPCWSTR) dstzn, // wide-character string
-1, // number of chars in string
szDest, // buffer for new string
MAX_PATH*2-2, // size of buffer
NULL, // default for unmappable chars
NULL); // set when default char used
if (nActualChars == 0)
return ZR_ARGS;
#else
strcpy(szDest, dstzn);
#endif
lasterrorZ = zip->Add(szDest, src, len, flags);
}
else
{
lasterrorZ = zip->Add((char *)dstzn, src, len, flags);
}
解决方案
修复bug的代码应该简化这个XZip.cpp ZipAdd (...)
1。检查无效dstzn参数
if (hz == 0)
{
lasterrorZ = ZR_ARGS;
return ZR_ARGS;
}
if (dstzn == NULL)
{
lasterrorZ = ZR_ARGS;
return ZR_ARGS;
}
TZipHandleData *han = (TZipHandleData*)hz;
2。取出的if / else总是转换的文件名,不管flags参数
值
TZip *zip = han->zip;
char szDest[MAX_PATH*2];
memset(szDest, 0, sizeof(szDest));
#ifdef _UNICODE
// need to convert Unicode dest to ANSI
int nActualChars = WideCharToMultiByte(CP_ACP, // code page
0, // performance and mapping flags
(LPCWSTR) dstzn, // wide-character string
-1, // number of chars in string
szDest, // buffer for new string
MAX_PATH*2-2, // size of buffer
NULL, // default for unmappable chars
NULL); // set when default char used
if (nActualChars == 0)
return ZR_ARGS;
#else
strcpy(szDest, dstzn);
#endif
lasterrorZ = zip->Add(szDest, src, len, flags);
return lasterrorZ;
修改10月19日'11
评论会员:
珠
时间:2011/11/29
喜:
试图使用ZIP_FOLDER CreateZip,但始终有一个错误返回{BR。 }
我试图收拾几个文件夹之下成一个zip文件的文件下一个指定的目录
任何人都可以阐明如何做一个光
? BR}感谢和问候,
柯
评论会员:
史蒂芬大号钟丽缇
时间:2011/11/29
该问题可能是Unicode的问题。 ZipAdd功能只处理Unicode正确文件和文件夹。解决方案:
ZRESULT ZipAdd(HZIP hz, const TCHAR *dstzn, void *src, unsigned int len, DWORD flags)
{
...
FROM:
if ( flags == ZIP_FILENAME )
{
TO:
if ( dstzn )
{
...
}
修改日(星期二),2011年8月23日下午08:03
评论会员:
汉斯迪特里希
时间:2011/11/29
!我真的很感谢汉斯和所有其中这段代码工作,因为它的工作原理{S3}
最近,我注意到,打开一个现有的zip文件报告"UNZ_BADZIPFILE"时,文件的大小大于2GB。为了解决这个问题,我做了很多改变我的代码副本,但它们可以被归纳为有兴趣的人(基本的问题是使用的变量是太小)如下:
- 改变所有的"无符号长"变量"无符号的__int64"(见unz_global_info,unz_file_info)
- 改变"ULONG"的定义,从"无符号长"的"无符号的__int64"(我刚刚摆脱"ULONG",取代它)
。 - 改变了几个"无符号整型"的"无符号的__int64"(特别是LUFILE结构的成员)
变量。 - 取代SetFilePointerEx()SetFilePointer(),这样您就可以使用的无符号的__int64值
。
例如更换的SetFilePointer()这是在"lufseek()"函数:
if (whence==SEEK_SET) { LARGE_INTEGER lnValue; lnValue.QuadPart = stream->initial_offset + offset; ::SetFilePointerEx(stream->h, lnValue, NULL, FILE_BEGIN); }受这种变化影响的文件XUnzip.cpp和XUnzip.h(更新结构的ZIPENTRY和ZIPENTRYW)
我做了有限的测试显示,它的作品,即我现在可以成功地从一个zip文件,大于2GB检索一个条目上市。
希望这有助于,
- 彼得
主人的第四Ray软件
fourthray.com
评论会员:
xpmule
时间:2011/11/29
,彼得
最美好的祝愿,
汉斯
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif)
评论会员:
汉斯迪特里希
时间:2011/11/29
。FindZipItem会失败,如果第一的常量字符TCHAR *名称是一个斜线
我在xunzip.cpp unzLocateFile添加2行代码,使解压缩文件更容易
while ( *(szFileName++) == 0x2F ) {} // remove / ( single forward slash ) szFileName--;
添加以上现在将允许或调用了领先的斜线。
FindZipItem因此,例如,以下所有工程
FindZipItem(HJ,"icon.png",0,IDX,ZE)
FindZipItem(HJ / icon.png",IDX,泽0)
FindZipItem(HJ,"/ res/image2d/icon.png",0,IDX,ZE)
FindZipItem(HJ,"META-INF/MANIFEST.MF",0,IDX,ZE)
FindZipItem(HJ / META-INF/MANIFEST.MF",0,IDX,ZE)
我知道人们阅读这些网页LOL
来吧发表一些意见,甚至更好一些改进
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_4.gif)
有人智能需要更新这个类允许更新现有的拉链,将凉
评论会员:
!xpmule
时间:2011/11/29
。
问题不在于更新类的愿望,但惹的事实,即原来的代码是这样一个可怕的意大利面条,几乎任何变化将打破别的东西。 {五}
最美好的祝愿,
汉斯
[
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif)
评论会员:
xpmule
时间:2011/11/29
IM找出硬盘的方式LOL
,
牢记这是没有2号线的Hello World例子
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_4.gif)
我不在乎其他人说什么..
其令人印象深刻,我很欣赏的努力投入此代码!
我再次发布,因为IM与挣扎的解压缩到内存ZR_MORE错误
其驾驶我坚果,我仍然不能真正看到出问题。
因为IM意识到这个问题,我可以解决此问题,但IM仍然
寻找适当的修复..
我继续运行通过unzReadCurrentFile与Visual Studio调试器
想看看为什么重新调用Unzipitem再次fixs的问题..
这是我干了什么.. (LEN = 1通知第二解压调用ZR_OK设置)
HZIP hj = OpenZip( theConfig.m_sNewAppJarPath, 0, ZIP_FILENAME ); if ( hj ) { ZIPENTRY ze; memset( &ze, 0, sizeof(ze) ); int idx = -1; ZRESULT fz = FindZipItem( hj, "META-INF/MANIFEST.MF", TRUE, &idx, &ze ); if ( fz == ZR_OK ) { uBufferSize = ze.unc_size; pBuffer = (char*)malloc( ze.unc_size ); ZRESULT zr = UnzipItem( hj, idx, pBuffer, uBufferSize, ZIP_MEMORY ); // unzReadCurrentFile patched ! if ( zr == ZR_MORE ) // Should NOT get here.. { Trace( WA, __FUNCTION__, "Unpack Manifest.mf ZR_MORE Bug Detected - Fixing.." ); zr = UnzipItem( hj, idx, pBuffer, 1, ZIP_MEMORY ); } if ( zr != ZR_OK ) { Trace( ER, __FUNCTION__, "Unpack Manifest.mf Problem Detected - Code: %08X", zr ); return NULL; } } // Find Manifest.mf in .Jar File Result else if ( fz == ZR_NOTFOUND ) { Trace( ER, __FUNCTION__, "Manifest.mf Could Not Be Found" ); return NULL; } else { Trace( ER, __FUNCTION__, "Find Manifest.mf Problem Detected - Code: %08X", fz ); return NULL; } CloseZip( hj ); // Cleanup }
东西显然是打破unzReadCurrentFile,必须有一个妥善的解决办法?
和解决方案,将工作ZIP_MEMORY ZIP_FILENAME等
评论会员:
汉斯迪特里希
时间:2011/11/29
我在xzip.cpp函数AddFolderContent的变化,我想我会分享
。没有带测试这个有很多,但到目前为止,似乎OK ..
首先,我所做的更改,因为,因为我没有工作喜欢的方式AddFolderContent。
我所做的是改变它的名字的。zip
中的内容BOOL AddFolderContent(HZIP hZip,TCHAR * AbsolutePath,TCHAR * DirToAdd)
normaly DirToAdd成zip文件,并添加,以及它的全部内容。
所以我想要的东西是添加的内容和目录结构的ZIP 出来加入到选定的DirToAdd文件夹的zip。
所以这以外的DirAdd文件夹中会做同样的事情不会被添加到ZIP
另外我之前,我想说感谢您的所有贡献者进行,我很欣赏的所有努力的人!
所以这里是我的变化后的完整功能(注:使用率保持不变)
我拿出一些日志代码,如果有人想知道为什么我添加了这么多的括号?
BOOL AddFolderContent( HZIP hZip, TCHAR* AbsolutePath, TCHAR* DirToAdd ) { HANDLE hFind; // file handle WIN32_FIND_DATA FindFileData; TCHAR PathToSearchInto [MAX_PATH] = {0}; //if (NULL != DirToAdd) //if ( strcmp( DirToAdd, "" ) != 0 ) //{ // ZipAdd(hZip, DirToAdd, 0, 0, ZIP_FOLDER); //} // Construct the path to search into "C:\\Windows\\System32\\*" _tcscpy(PathToSearchInto, AbsolutePath); _tcscat(PathToSearchInto, _T("\\"));// _tcscat(PathToSearchInto, DirToAdd); _tcscat(PathToSearchInto, _T("\\*")); hFind = FindFirstFile(PathToSearchInto,&FindFileData); // find the first file if(hFind == INVALID_HANDLE_VALUE) { return FALSE; } bool bSearch = true; while(bSearch) // until we finds an entry { if(FindNextFile(hFind,&FindFileData)) { // Don't care about . and .. //if(IsDots(FindFileData.cFileName)) if ( (_tcscmp(FindFileData.cFileName, _T(".")) == 0) || (_tcscmp(FindFileData.cFileName, _T("..")) == 0) ) continue; // We have found a directory if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { TCHAR RelativePathNewDirFound[MAX_PATH] = {0}; _tcscat(RelativePathNewDirFound, DirToAdd); _tcscat(RelativePathNewDirFound, _T("\\")); _tcscat(RelativePathNewDirFound, FindFileData.cFileName); // Recursive call with the new directory found if (AddFolderContent(hZip, AbsolutePath, RelativePathNewDirFound)== FALSE) { return FALSE ; } } // We have found a file else { // Add the found file to the zip file TCHAR RelativePathNewFileFound[MAX_PATH] = {0}; _tcscpy(RelativePathNewFileFound, DirToAdd); _tcscat(RelativePathNewFileFound, _T("\\")); _tcscat(RelativePathNewFileFound, FindFileData.cFileName); char* ptr1 = strchr( RelativePathNewFileFound, '\\' ); // if ( strcmp( ptr1, "" ) == 0 ) { // log error here ? } char* ptr2; if ( ptr1[0] == 0x5C ) // kill first backslash { ptr2 = strchr( ptr1, ptr1[1] ); } if ( ZipAdd( hZip, ptr2, RelativePathNewFileFound, 0, ZIP_FILENAME) != ZR_OK ) { return FALSE; } } }//FindNextFile else { if(GetLastError() == ERROR_NO_MORE_FILES) // no more files there { bSearch = false; } else { // some error occured, close the handle and return FALSE FindClose(hFind); return FALSE; } } }//while FindClose(hFind); // closing file handle return true; }
评论会员:
xpmule
时间:2011/11/29
这是一个极好的,我感谢您愿意分享
两个问题:
1。你运行此代码演示测试?
我还没有机会看看这个详细,但我将发布您的版本 - 你与信贷 - 如果你想我。这是可以接受的吗?如果有的话,请送我用您的更改压缩的完整的项目(不包括EXE)。请您认为合适的任何修改文件头。拉链我的Gmail点com。hdietrich
最美好的祝愿,
汉斯
[
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif)
评论会员:
xpmule
时间:2011/11/29
您汉斯很多,我没有专业的程序员
但IM一个35yr老家伙喜欢上项目的工作作为一种业余爱好
和IM为LG手机的黑客工具,并使用该zip
代码。jar文件中提取文件写入。我的工具重建一个databse
LG手机中添加应用程序的目的和格式化内容。
昨晚我做了一个关于在Zip头
所述的主机操作系统搜索位和我改变了我的代码,模仿相同的操作系统版本作为一个zip用winrar报告时。
我认为这可能是有趣的一个#define或东西头,编码器可以
选择主机/版本,他希望在他的拉链
在TZip:我改变以下,
zfi.vem = (ush)0x0014; //0xB17; // 0xB00 is win32 os-code. 0x17 is 23 in decimal: zip 2.3 zfi.ver = (ush)20;,将显示在WinRAR的信息框,归档文件是DOS 2.0和2.0的Windows
下面是一个图表,我发现有关此问题上的净..
还林不知道它使得任何反正LOL
的区别
PKZIP主机操作系统表
0 - MS - DOS和OS / 2(发)
1 - Amiga的
2 - VMS的
3 - * nix的
4 - VM / CMS
5 - 雅达利ST
6 - OS / 2 1.2扩展文件系统
7 - 麦金塔
8-255 - 未使用
* /
我做了我自己的源MOD很多年前,我注意到这个代码仍然是目前
beeing阀门公司所使用的。在他们所有的游戏源,但他们使用的是1.0版的代码
只是一个有趣的观察,我想大多数人不会知道。
我强烈建议,警告人们某处的文件,你不能
呼叫OpenZip和具有相同的处理AddZip,我觉得在这个代码的悲哀限制
否则很令人印象深刻的包
代码。
我mod'ing AddFolderContent现在返回书面项目NUM
这种方式可以使用返回的结果来验证邮编创造等
(几乎做到了有probs文件夹计数)
最后,我将尝试运行你的测试代码汉斯,我没想到,好主意(我看到了/我知道你的意思)
并确保病患者做什么,我可以分享我的变化...
评论会员:
xpmule
时间:2011/11/29
所以这是我干了什么至今AddFolderContent
,如果我能帮助在所有然后遐
使用这个你必须添加下面一行XZIP.cpp
extern int NumFilesAdded = 0;将要添加足够高,所以CloseZip可以使用它。
然后添加= 0 NumFilesAdded;。CloseZipZ如下所示:
ZRESULT CloseZipZ(HZIP hz) { if (hz==0) {lasterrorZ=ZR_ARGS;return ZR_ARGS;} TZipHandleData *han = (TZipHandleData*)hz; if (han->flag!=2) {lasterrorZ=ZR_ZMODE;return ZR_ZMODE;} TZip *zip = han->zip; lasterrorZ = zip->Close(); delete zip; delete han; NumFilesAdded = 0; return lasterrorZ; }
然后改变我粘贴在下面的版本的功能。的变化,从BOOL头返回类型为int。
/* * Change #1. Modified return type from bool to int in order * to return number of items added to newly created zip. * Also added global variable NumFilesAdded to store items added. * Usage example: CreateZip -> AddFolderContent -> CloseZip * Then OpenZip -> GetZipItem -> CloseZip. * Then compare AddFolderContent return result to items reported in GetZipItem. * If the results match then zip was created correctly. * Change #2. Removed param #3 TCHAR* DirToAdd from beeing written to zip. * Note: AddFolderContent Parameter Usage remains the same. * And each call to CloseZip will set the variable NumFilesAdded back to 0. */ int AddFolderContent( HZIP hZip, TCHAR* AbsolutePath, TCHAR* DirToAdd ) { HANDLE hFind; // file handle WIN32_FIND_DATA FindFileData; TCHAR PathToSearchInto [MAX_PATH] = {0}; // Construct the path to search into "C:\\Windows\\System32\\*" _tcscpy(PathToSearchInto, AbsolutePath); _tcscat(PathToSearchInto, _T("\\"));// _tcscat(PathToSearchInto, DirToAdd); _tcscat(PathToSearchInto, _T("\\*")); hFind = FindFirstFile(PathToSearchInto,&FindFileData); // find the first file if(hFind == INVALID_HANDLE_VALUE) { return FALSE; } bool bSearch = true; while(bSearch) // until we finds an entry { if(FindNextFile(hFind,&FindFileData)) { // Don't care about . and .. //if(IsDots(FindFileData.cFileName)) if ( (_tcscmp(FindFileData.cFileName, _T(".")) == 0) || (_tcscmp(FindFileData.cFileName, _T("..")) == 0) ) continue; // We have found a directory if ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { TCHAR RelativePathNewDirFound[MAX_PATH] = {0}; _tcscat(RelativePathNewDirFound, DirToAdd); _tcscat(RelativePathNewDirFound, _T("\\")); _tcscat(RelativePathNewDirFound, FindFileData.cFileName); // Recursive call with the new directory found if ( AddFolderContent(hZip, AbsolutePath, RelativePathNewDirFound) == FALSE ) { return FALSE ; } } // We have found a file else { // Add the found file to the zip file TCHAR RelativePathNewFileFound[MAX_PATH] = {0}; _tcscpy(RelativePathNewFileFound, DirToAdd); _tcscat(RelativePathNewFileFound, _T("\\")); _tcscat(RelativePathNewFileFound, FindFileData.cFileName); char* ptr1 = strchr( RelativePathNewFileFound, '\\' ); //if ( strcmp( ptr1, "" ) == 0 ){} char* ptr2; if ( ptr1[0] == 0x5C ) // kill first backslash { ptr2 = strchr( ptr1, ptr1[1] ); } if ( ZipAdd(hZip, ptr2, RelativePathNewFileFound, 0, ZIP_FILENAME) != ZR_OK ) { return false; } else { NumFilesAdded += 1; } } }//FindNextFile else { if ( GetLastError() == ERROR_NO_MORE_FILES ) // no more files there { bSearch = false; } else { // some error occured, close the handle and return FALSE FindClose(hFind); return false; } } }//while FindClose(hFind); // closing file handle return NumFilesAdded; }
我创建了一个在我的程序的功能,我演示了如何创建一个文件夹
邮编然后验证的项目数..
int CDatabaseTools::CreateJar( void* Jar, char* szPath, char* szDirectory ) { // Create Zip & add folder contents. HZIP hz = CreateZip( Jar, 0, ZIP_FILENAME ); int res = AddFolderContent( hz, szPath, szDirectory ); CloseZip( hz ); // verify newly created zip. ZIPENTRY ze; memset( &ze, 0, sizeof(ze) ); HZIP hj = OpenZip( Jar, 0, ZIP_FILENAME ); GetZipItem( hj, -1, &ze ); CloseZip( hj ); int numitems = ze.index; if ( res != numitems ) { Trace( ER, __FUNCTION__, "Zip Verification Failed" ); return 1; } else { Trace( ZP, __FUNCTION__, "Zip Verified" ); return 0; } }
终于来了我叫我在我的MFC应用程序的新功能是如何..
void CPPgKeybo2::OnBnClickedButton2() { int res = theDatabaseTools.CreateJar( "D:\\LG Mobile Tools\\Test.jar", "D:\\LG Mobile Tools", "tmp" ); if ( res != 0 ) { Trace( ER, __FUNCTION__, "Create New .Jar Failed" ); } else { Trace( ZP, __FUNCTION__, "Create New .Jar Succeeded" ); } }
评论会员:
xpmule
时间:2011/11/29
TUnzip:解压缩创建只读文件,我不知道这是否是拟由我觉得很跛脚
!所以我做了速战速决,我想我会分享..在解压缩的行象下面这样的改变,
来自:
H =:的CreateFile((常量TCHAR *)DST,GENERIC_WRITE,0,NULL,则CREATE_ALWAYS,ze.attr,NULL);
到:
H =:的CreateFile((常量TCHAR *)DST,GENERIC_WRITE,0,NULL,则CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
此外,我不能相信这是另一个压缩类,支持除
几乎所有单个文件添加到现有的zip LOL,只是打击我走!
而只是为了迷惑了每个人的地狱广泛的代码注释deliberatly避免接触受,
让用户张贴在这里,为什么呢?为什么我不能..等可能已经完成的至少是它在页面中添加一个警告,如果它不能在代码中提到的。很抱歉,但真正打勾我,因为我不断发现同样的问题与其他类似拉链项目
这是排在第三,缺少的功能,似乎忘了提..
你不能将文件添加到zip的..除非你创建自己第一个
normaly我staticly链接zlib的,但一个更容易的选择希望..
哦..如果我得到更新zip的工作,我会后我的其他人修复
评论会员:
汉斯迪特里希
时间:2011/11/29
这个只读修复我并不总是工作。它似乎向工作在第一,但
尝试许多不同的zip文件后,我发现在某些情况下,你会得到什么
但一个空文件没有错误报告..
张贴几年回来的人,你改变以下属性创建,
ze.attr ^ = FILE_ATTRIBUTE_READONLY
现在我还没有测试,但我担心,如果你确实想要一个文件
提取只读其他修复将是不可能的。
现在我不知道非常关注的zip格式,但我没有用WINRAR一个快速的测试..
我做了一个文件的只读和zip'd然后提取到一个新的文件夹,
新创建的/解压缩文件被提取出来保存的只读属性。
我的观点?我认为,修复其他人会打破预期的功能..
所以我做了一些调试跟着做什么xunzip.cpp发生时属性得到
和问题无关读取或设置只读属性(最好的,我可以告诉)
这个问题在下面的代码实际上..
bool uwriteable= (a&0x00800000)!=0; // ***hd*** if (!uwriteable||wreadonly) ze->attr|=FILE_ATTRIBUTE_READONLY;uwriteable设置为false时,应设置为TRUE
因此,我所做的是改变的代码块,该行发现和
最初修改的行,我发布之前恢复其原来的形式如下所示设置..
h = ::CreateFile((const TCHAR*)dst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, ze.attr, NULL);
下面的代码是什么我基本上改变(TUnzip发现:GET)
unsigned long a = ufi.external_fa; bool uisdir = ( a&0x40000000 ) != 0; bool wreadonly = ( a&0x00000001 ) != 0; bool whidden = ( a&0x00000002 ) != 0; bool wsystem = ( a&0x00000004 ) != 0; bool wisdir = ( a&0x00000010 ) != 0; bool warchive = ( a&0x00000020 ) != 0; ze->attr=FILE_ATTRIBUTE_NORMAL; if ( uisdir || wisdir ) ze->attr |= FILE_ATTRIBUTE_DIRECTORY; if ( warchive ) ze->attr |= FILE_ATTRIBUTE_ARCHIVE; if ( whidden ) ze->attr |= FILE_ATTRIBUTE_HIDDEN; if ( wreadonly ) ze->attr |= FILE_ATTRIBUTE_READONLY; if ( wsystem ) ze->attr |= FILE_ATTRIBUTE_SYSTEM;
这种变化(我删除了uwritable检查)应该有希望解决的文件,beeing创建只读问题
除非他们是假设要提取为只读。
和IM不知道为什么还没有发生这种情况,如果因为某些文件只是缺少UNIX属性,或者如果代码只是interpeting发现的数据不正确?
有人更聪明,要解决这个问题呢?我想看看在下面的调用..
unzlocal_getLong unzlocal_GetCurrentFileInfoInternal调用(文件,功放; S - GT file_info.external_fa)
评论会员:
tbrammer
时间:2011/11/29
感谢,我会看看这个
。最美好的祝愿,
汉斯
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif)
评论会员:
chaa
时间:2011/11/29
如果一个文件被添加到一个ZIP,在其名称中包含非ANSI字符,这些字符乱码的ZIP。这IST,因为
ZRESULT ZipAdd(HZIP hz, const TCHAR *dstzn, void *src, unsigned int len, DWORD flags)widechar名称转换为char使用ANSI代码页:
这是不对的。据
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_9.gif)
CP_OEMCP而不是CP_ACP。
除了(正如我在前面发布)转换为文件和
目录的名称。因此,这是我的固定版本:
ZRESULT ZipAdd(HZIP hz, const TCHAR *dstzn, void *src, unsigned int len, DWORD flags) { if (hz == 0) { lasterrorZ = ZR_ARGS; return ZR_ARGS; } TZipHandleData *han = (TZipHandleData*)hz; if (han->flag != 2) { lasterrorZ = ZR_ZMODE; return ZR_ZMODE; } TZip *zip = han->zip; char szDest[MAX_PATH*2]; memset(szDest, 0, sizeof(szDest)); #ifdef _UNICODE // need to convert Unicode dest to To IBM Codepage 437 (DOS US / OEM-US) - NOT to ANSI // See http://www.pkware.com/documents/casestudies/APPNOTE.TXT // This will only work for chars within this codepage. If filenames conatain other Unicode chars // all names must be converted to UTF-8 and bit 11 of the "general purpose bit flag" must be set. // (not implemented yet) int nActualChars = WideCharToMultiByte(CP_OEMCP, // code page //TB100715 CP_ACP --> CP_OEMCP 0, // performance and mapping flags (LPCWSTR) dstzn, // wide-character string -1, // number of chars in string szDest, // buffer for new string MAX_PATH*2-2, // size of buffer NULL, // default for unmappable chars NULL); // set when default char used if (nActualChars == 0) return ZR_ARGS; #else strcpy(szDest, dstzn); #endif if (flags == ZIP_FILENAME) { lasterrorZ = zip->Add(szDest, src, len, flags); } else { lasterrorZ = zip->Add(szDest, src, len, flags); } return lasterrorZ; }
注意:此修补程序将只为在DOS美代码页的字符。如果文件名conatain其他Unicode字符
所有的名字必须被转换成UTF - 8和"通用位标志位"11必须设置。 (未实现)
详情请参阅
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_9.gif)
评论会员:
汉斯迪特里希
时间:2011/11/29
对于CP_OEMCP(我的情况下CP866)用WinRAR,你需要改变功能TZip::
zfi.vem =(USH)0xB17;
zfi.vem =(USH)20
评论会员:
。TiL_MtL
时间:2011/11/29
感谢
最美好的祝愿,
汉斯
![](http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif)
评论会员:
游客
时间:2011/11/29
会员953718|最近,我得出了同样的情况{七}。我还参加了一个快速查找代码,我终于想通了,在解压缩的代码,而无需修改任何一个方法来使用它。我UnzipItem()调用适当的缓冲区大小,根据解压大小与GetZipItem()获得。当时的文件被解压缩,但ZR_MORE返回错误代码。然后,我再次呼吁UnzipItem1个字节的缓冲区。返回OK,在那个时候,确认有没有其他解压缩该文件。我试着用不同的长度和各种内容的缓冲区,我得到了成功的结果imgsrc=http://www.orcode.com/upimg/2011_11_29_19_14_40_4.gif的。包括用于执行测试的代码的一部分。希望其要去帮助别人......TiL_MtLcodeprespanclass="code-preprocessor"#define/spanBUFLENBIGspanclass="code-digit"40000/spanspanclass="code-keyword"void/spanTst(char*pBuf,spanclass="code-keyword"int/spanlen){ZRESULTlZErr;void*lZipBuf;unsignedspanclass="code-keyword"long/spanlZipLen;ZIPENTRYlZEntry;spanclass="code-keyword"char/spanlZipFile[BUFLENBIG];spanclass="code-keyword"char/spanlUnzipFile[BUFLENBIG];spanclass="code-keyword"char/spanlDummy; spanclass="code-comment"///spanspanclass="code-comment"/spanspanclass="code-comment"///spanspanclass="code-comment"Zipcontent/spanspanclass="code-comment"///spanspanclass="code-comment"/spanHZIPlZH=CreateZip(lZipFile,BUFLENBIG,ZIP_MEMORY);ASSERT(lZH!=NULL); lZErr=ZipAdd(lZH,spanclass="code-string""/spanspanclass="code-string"1"/span,pBuf,len,ZIP_MEMORY);ASSERT(lZErr==ZR_OK); spanclass="code-comment"///spanspanclass="code-comment"Getzipfilelength/spanlZErr=ZipGetMemory(lZH,&lZipBuf,&lZipLen);ASSERT(lZErr==ZR_OK);ASSERT(lZipBuf==lZipFile); lZErr=CloseZip(lZH);ASSERT(lZErr==ZR_OK); spanclass="code-comment"///spanspanclass="code-comment"/spanspanclass="code-comment"///spanspanclass="code-comment"Unzipcontent/spanspanclass="code-comment"///spanspanclass="code-comment"/spanHZIPlZH2=OpenZip(lZipBuf,lZipLen,ZIP_MEMORY);ASSERT(lZH2!=NULL); spanclass="code-comment"///spanspanclass="code-comment"Getuncompressedlength/spanlZErr=GetZipItem(lZH2,spanclass="code-digit"0/span,&lZEntry);ASSERT(lZErr==ZR_OK);ASSERT(lZEntry.unc_size==len); spanclass="code-comment"///spanspanclass="code-comment"Unzip/spanlZErr=UnzipItem(lZH2,spanclass="code-digit"0/span,lUnzipFile,lZEntry.unc_size,ZIP_MEMORY);ASSERT(lZErr==ZR_MORE);spanclass="code-comment"///spanspanclass="code-comment"AlwaysreturnZR_MORE./spanspanclass="code-comment"///spanspanclass="code-comment"Tryagaintomakesureitworked!/spanlZErr=UnzipItem(lZH2,spanclass="code-digit"0/span,&lDummy,spanclass="code-digit"1/span,ZIP_MEMORY);ASSERT(lZErr==ZR_OK); lZErr=CloseZip(lZH2);ASSERT(lZErr==ZR_OK); ASSERT(memcmp(lUnzipFile,pBuf,len)==spanclass="code-digit"0/span);}/pre/code
汉斯迪特里希
评论会员:
游客
时间:2011/11/29
您好,首先......这代码是一个伟大的事情,但我不知道如何使用写得太Unix上的所有东西。在现阶段,我发展与WindowsQtCreator一个小项目,但源代码是完全窗口独立,无需更改任何代码可在Unix编译。PPL这里,也许一些有同样的问题,并创建了所有必要的更改源码包?否则,我硬着头皮和工作,通过自己的解决方案(为什么要推倒重来^^)这么久塞巴斯蒂安
babiq
评论会员:
游客
时间:2011/11/29
嗨,有没有办法显示一个进度给用户一个漫长的压缩操作时发生?可能是一个回调函数?{S9}
Velja Radenkovic
评论会员:
游客
时间:2011/11/29
是的,这已经提出过。我会尝试将它添加,{S3}最美好的祝愿,汉斯[imgsrc=http://www.orcode.com/upimg/2011_11_29_19_14_40_5.gif