Zip.cpp的例子

 简介
我已经介绍了在{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;

#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
,彼得
最美好的祝愿,
汉斯

 
评论会员: 汉斯迪特里希  时间: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 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 
最美好的祝愿,
汉斯

[  
评论会员: 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
感谢,我会看看这个
。最美好的祝愿,
汉斯
 
评论会员: 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; 

#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必须设置。 (未实现)
详情请参阅  
评论会员: 汉斯迪特里希  时间: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#
XML
 平台,框架和库
 编程通用
 图形/设计
 开发周期
 一般阅读
 第三方产品
 作者资源
 其他
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值