1. 程式人生 > >基於Zlib實現的從ZIP檔案中提取檔案資料

基於Zlib實現的從ZIP檔案中提取檔案資料

[cpp] view plaincopyprint?
  1. ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer,constchar* zfn,constchar* fname,constchar* password)
  2. {
  3. unzFile uf = unzOpen(zfn);
  4. if (NULL == uf)
  5. {
  6. printf("unzOpen failed...\n");
  7. return -1;
  8. }
  9. int err = unzLocateFile(uf, fname, 0);
  10. if (UNZ_OK != err)
  11. {
  12. printf("GetFileInZip unzLocateFile failed... error:%d\n"
    );
  13. return err;
  14. }
  15. unz_file_info file_info;
  16. char filename_inzip[256];
  17. err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip,sizeof(filename_inzip), NULL, 0, NULL, 0);
  18. if (UNZ_OK != err)
  19. {
  20. printf("unzGetCurrentFileInfo failed... error:%d\n", err);
  21. return err;
  22. }
  23. err = unzOpenCurrentFilePassword(uf, password);
  24. if (UNZ_OK != err)
  25. {
  26. printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
  27. return err;
  28. }
  29. char* pBuff = newchar[file_info.uncompressed_size];
  30. if (pBuff == NULL)
  31. {
  32. unzCloseCurrentFile(uf);
  33. unzClose(uf);
  34. return -2;
  35. }
  36. err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);
  37. if (err < 0)
  38. {
  39. printf("unzReadCurrentFile failed... error:%d\n", err);
  40. delete [] pBuff;
  41. unzCloseCurrentFile(uf);
  42. unzClose(uf);
  43. return err;
  44. }
  45. // Append data to the MemBuffer
  46. buffer.Append(pBuff, file_info.uncompressed_size);
  47. unzCloseCurrentFile(uf);
  48. unzClose(uf);
  49. return err;
  50. }
ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer, const char* zfn, const char* fname, const char* password)
{
	unzFile uf = unzOpen(zfn);
	
	if (NULL == uf)
	{
		printf("unzOpen failed...\n");
		return -1;
	}
	
	int err = unzLocateFile(uf, fname, 0);
	if (UNZ_OK != err)
	{
		printf("GetFileInZip unzLocateFile failed... error:%d\n");
		return err;
	}
	
	unz_file_info file_info;
	char filename_inzip[256];
	
	err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);

	if (UNZ_OK != err)
	{
		printf("unzGetCurrentFileInfo failed... error:%d\n", err);
		return err;
	}

	err = unzOpenCurrentFilePassword(uf, password);

	if (UNZ_OK != err)
	{
		printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
		return err;
	}

	char* pBuff = new char[file_info.uncompressed_size];

	if (pBuff == NULL)
	{
		unzCloseCurrentFile(uf);
		unzClose(uf);
		return -2;
	}

	err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);

	if (err < 0)
	{
		printf("unzReadCurrentFile failed... error:%d\n", err);
		delete [] pBuff;
		unzCloseCurrentFile(uf);
		unzClose(uf);
		return err;
	}
	// Append data to the MemBuffer
	buffer.Append(pBuff, file_info.uncompressed_size);

	unzCloseCurrentFile(uf);

	unzClose(uf);
	return err;
}
其中關鍵的操作函式就只有7個: