简介
我已经介绍了在{A} XZip。本文介绍XZip也XUnzip,这允许您添加ZIP解压缩到您的应用程序,而不使用任何的。lib或。dll。
首先,让我承认的工作和生产的。cpp和。h文件是基于XZip。XZip和XUnzip特点
的大部分功能都体现在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不使用预编译头。一定要做好所有配置。

当我尝试建立的演示程序,我得到的链接错误链接:致命错误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;没有明示或暗示保证。我接受业务,该软件可能导致的任何损害或损失不承担任何责任。

关于作者:汉斯迪特里希

中国

我是一名编程爱好者,
谢谢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;#elsestrcpy(szDest, dstzn);#endiflasterrorZ = 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;#elsestrcpy(szDest, dstzn);#endiflasterrorZ = 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

,彼得
最美好的祝愿,
汉斯

评论会员:汉斯迪特里希 时间: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 
来吧发表一些意见,甚至更好一些改进
有人智能需要更新这个类允许更新现有的拉链,将凉

评论会员:!xpmule 时间:2011/11/29

问题不在于更新类的愿望,但惹的事实,即原来的代码是这样一个可怕的意大利面条,几乎任何变化将打破别的东西。 {五} 
最美好的祝愿,
汉斯

[

评论会员:xpmule 时间:2011/11/29

IM找出硬盘的方式LOL 
, 
牢记这是没有2号线的Hello World例子

我不在乎其他人说什么.. 
其令人印象深刻,我很欣赏的努力投入此代码!

我再次发布,因为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 fileif(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 directoryif((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 foundif (AddFolderContent(hZip, AbsolutePath, RelativePathNewDirFound)== FALSE){return FALSE ;}}// We have found a fileelse{// Add the found file to the zip fileTCHAR 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;}}}//FindNextFileelse{if(GetLastError() == ERROR_NO_MORE_FILES) // no more files there{bSearch = false;}else{// some error occured, close the handle and return FALSEFindClose(hFind);return FALSE;}}}//whileFindClose(hFind); // closing file handlereturn true;}
评论会员:xpmule 时间:2011/11/29

这是一个极好的,我感谢您愿意分享

两个问题:

1。你运行此代码演示测试?

我还没有机会看看这个详细,但我将发布您的版本 - 你与信贷 - 如果你想我。这是可以接受的吗?如果有的话,请送我用您的更改压缩的完整的项目(不包括EXE)。请您认为合适的任何修改文件头。拉链我的Gmail点com。hdietrich 
最美好的祝愿,
汉斯

[

评论会员: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 fileif(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 directoryif ( 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 foundif ( AddFolderContent(hZip, AbsolutePath, RelativePathNewDirFound) == FALSE ){return FALSE ;}}// We have found a fileelse{// Add the found file to the zip fileTCHAR 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;}}}//FindNextFileelse{if ( GetLastError() == ERROR_NO_MORE_FILES ) // no more files there{bSearch = false;}else{// some error occured, close the handle and return FALSEFindClose(hFind);return false;}}}//whileFindClose(hFind); // closing file handlereturn 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

感谢,我会看看这个
。最美好的祝愿,
汉斯

评论会员: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代码页:
这是不对的。据在DOS美国代码页是使用。你必须使用
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; #elsestrcpy(szDest, dstzn);#endifif (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必须设置。 (未实现)
详情请参阅

评论会员:汉斯迪特里希 时间:2011/11/29

对于CP_OEMCP(我的情况下CP866)用WinRAR,你需要改变功能TZip::

zfi.vem =(USH)0xB17;

zfi.vem =(USH)20

评论会员:。TiL_MtL 时间:2011/11/29

感谢
最美好的祝愿,
汉斯

评论会员:游客 时间: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

文章分类
桌面
网页开发
移动开发
数据库
多媒体
编程语言
C / C++
C++ / CLI
C#
MSIL
VBScript
VB.NET
VB6 Interop
其他 .NET
XML
Java
Perl
平台,框架和库
编程通用
图形/设计
开发周期
一般阅读
第三方产品
作者资源
其他
快速解答标签
c x 6850
VC x 7405

发表最多

  • bienvenu

  • zhaoxushi

  • 6gouqu

  • 博乐娃

  • verydogs

  • 容贵

  • 松下男人

  • px1624

  • bocconi

价值作最多

  • 67638980

  • 方方kiki

  • xyl123tb

  • 飞翔的焰火

  • 雪军

  • mianwife

  • 伟城

  • irisappliance

  • xueyl00

最新登陆

  • mianwife

  • wlq1204

  • 启孟

  • 心海

  • 天芳

  • kapu

  • 功人

  • 唯C

  • killerXP

Zip.cpp的例子相关推荐

  1. 【python】zip 介绍和例子

    介绍 在 Python 教程的这一章中,我们将讨论美妙且极其有用的功能"zip".不幸的是,Python 的初学者经常被 zip 不必要地混淆和害怕.首先这个名字很混乱.许多人将 ...

  2. python 的zip 函数小例子

    In [57]: name = ('Tome','Rick','Stephon') In [58]: age = (45,23,55) In [59]: for a,n in zip (name,ag ...

  3. VC++使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)

    目录 1.使用场景 2.压缩包的创建 3.压缩包的解压 4.CloseZipZ和CloseZipU两接口的区别

  4. linux压缩和解压缩命令tar,zip,gzip

    Linux上有很多解压缩文件的命令.其中最新和最有效的是xz,但他们都有节省磁盘空间和保存文件供以后使用的优点.在这篇文章中,我们比较了解压缩命令并指出了显著的区别. 1.tar 语法: tar [o ...

  5. ubuntu解压zip文件命令_Linux常用命令10 - unzip

    zip 是最广泛使用的归档文件, 除了linux,windows也是非常的广泛.,支持无损数据压缩. zip 文件是包含一个或多个压缩文件或目录的数据容器. 接下来,我将解释如何使用 unzip 命令 ...

  6. Using ZipLib to create a Zip File in C#

    System.IO.Compression是.Net 2.0里与压缩有关的命名空间,但是使用起来并不是很方便.使用第3方库ziplib可以很方便地进行压缩类的操作. 从[1] 下载动态库,然后在工程里 ...

  7. linux命令zip打包,linux下zip命令打包与解包

    linux zip命令的基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显 ...

  8. C++ zip压缩库使用

    这个压缩库,主要是用来解压和压缩相关文件使用,好处就是引入比较方便,而且极其易使用,方便用户操作. 首先是引入这四个文件,相关代码如下: 首先是zip.h头文件 #ifndef _zip_H #def ...

  9. persistence.cpp:2197:ann.xml(1): There should be space between attributes in function icvXMLParseTag

    August 3, 2016 作者:dengshuai_super 出处:http://blog.csdn.net/dengshuai_super/article/details/52069634 声 ...

最新文章

  1. 第八章 异常控制流 笔记
  2. 深度学习中的Normalization模型(附实例公式)
  3. 机智云5.0推出IoT套件GoKit4.0 可实现物联网应用协同开发
  4. IBATIS错误汇总
  5. hbase里插入big int数据用Phoenix查看的报错问题
  6. python3进阶开发-第一个仿博客园的项目(1)
  7. android applybatch,android – 使用applyBatch插入成千上万的联系人条目很慢
  8. Linux导出函数控制,linux 下仅导出指定函数的方法
  9. 结合 Apache Kafka 生态系统,谈谈2018年机器学习五大趋势
  10. mysql 事务中锁处理_MySQL事务处理及锁定_MySQL
  11. list 和 iterate
  12. mysql主键和外键的连接_MySQL的主键和外键
  13. Maven下载安装与配置
  14. 群晖DS218+部署kafka
  15. 从官网下载 Google Chrome 离线安装包 谷歌浏览器 最新版
  16. 纯html+css写一个收款收据或者发票样式
  17. MATLAB-数据插值
  18. 汇编语言——偏移地址超过有效地址FFFFH
  19. THINKPHP网站漏洞怎么修复解决
  20. 解决height:100vh超出屏幕高度的问题

热门文章

  1. 解决浏览器不能打开摄像头问题
  2. PDU与SDU的区别
  3. EMM service request有哪些触发场景和作用?
  4. javaweb-青橙项目-9-84
  5. 中科大苏州计算机学院学费,中国科技大学0704071551_2:研究生学费住宿费缴纳说明(苏州)...
  6. CSS之display:block布局
  7. 实战:活动运营的最高境界 产品活动化活动产品化
  8. html5幻灯片 自动滑动,纯js和CSS3炫酷自动幻灯片特效
  9. c语言字符乘号怎么输入,c语言中逗号运算符和乘号哪个优先级高
  10. win10平台下VS2019+Qt5.14.2开发环境搭建