zip-unzip

zip-unzip

基于C语言 跨平台zip/unzip
https://github.com/JHiroGuo/zip-unzip

zip

(1) 传统用法,从现有文件创建zip文件

    HZIP hz = CreateZip("c:\\simple1.zip",0);

    ZipAdd(hz,"znsimple.bmp", "c:\\simple.bmp");

    ZipAdd(hz,"znsimple.txt", "c:\\simple.txt");

    CloseZip(hz);

(2) 内存使用,从各种来源创建一个自动分配的基于内存的zip文件

    HZIP hz = CreateZip(0,100000, 0);

    // adding a conventional file...

    ZipAdd(hz,"src1.txt",  "c:\\src1.txt");

    // adding something from memory...
    char buf[1000];
    for (int i=0; i<1000; i++) 
    	buf[i]=(char)(i&0x7F);

    ZipAdd(hz,"file.dat",  buf,1000);

    // adding something from a pipe...

    HANDLE hread,hwrite; 
    CreatePipe(&hread,&hwrite,NULL,0);

    HANDLE hthread = CreateThread(0,0,ThreadFunc,(void*)hwrite,0,0);

    ZipAdd(hz,"unz3.dat",  hread,1000);  // the '1000' is optional.

    WaitForSingleObject(hthread,INFINITE);

    CloseHandle(hthread); 
    CloseHandle(hread);

    // and now that the zip is created, let's do something with it:

    void *zbuf; unsigned long zlen; 
    ZipGetMemory(hz,&zbuf,&zlen);

    HANDLE hfz = CreateFile("test2.zip",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

    LDWORD writ; 
    
    WriteFile(hfz,zbuf,zlen,&writ,NULL);

    CloseHandle(hfz);

    CloseZip(hz);

(3) 句柄用于文件句柄和管道

    HANDLE hzread,hzwrite; 
    
    CreatePipe(&hzread,&hzwrite,0,0);

    HANDLE hthread = CreateThread(0,0,ZipReceiverThread,(void*)hzread,0,0);

    HZIP hz = CreateZipHandle(hzwrite,0);

    // ... add to it

    CloseZip(hz);

    CloseHandle(hzwrite);

    WaitForSingleObject(hthread,INFINITE);

    CloseHandle(hthread);

unzip

(1) 传统方法

	SetCurrentDirectory("c:\\docs\\stuff");

	HZIP hz = OpenZip("c:\\stuff.zip",0);

	ZIPENTRY ze; 
	GetZipItem(hz,-1,&ze); 
	int numitems=ze.index;

	for (int i=0; i<numitems; i++)
	{ 
	  GetZipItem(hz,i,&ze);

	  UnzipItem(hz,i,ze.name);
	}

	CloseZip(hz);

(2) 特殊需求

	HRSRC hrsrc = FindResource(hInstance,MAKEINTRESOURCE(1),RT_RCDATA);

	HANDLE hglob = LoadResource(hInstance,hrsrc);

	void *zipbuf=LockResource(hglob);

	unsigned int ziplen=SizeofResource(hInstance,hrsrc);

	HZIP hz = OpenZip(zipbuf, ziplen, 0);

	 // - unzip to a membuffer -

	ZIPENTRY ze; int i; 

	FindZipItem(hz,"file.dat",true,&i,&ze);

	char *ibuf = new char[ze.unc_size];

	UnzipItem(hz,i, ibuf, ze.unc_size);

	delete[] ibuf;

	  // - unzip to a fixed membuff -

	ZIPENTRY ze; int i; 

	FindZipItem(hz,"file.dat",true,&i,&ze);

	char ibuf[1024]; ZRESULT zr=ZR_MORE; unsigned long totsize=0;

	while (zr==ZR_MORE)

	{ 
	  zr = UnzipItem(hz,i, ibuf,1024);

	  unsigned long bufsize=1024; 
	  if (zr==ZR_OK) 
	    bufsize=ze.unc_size-totsize;

	  totsize+=bufsize;

	}

	  // - unzip to a pipe -

	HANDLE hwrite;

	HANDLE hthread=CreateWavReaderThread(&hwrite);

	int i; ZIPENTRY ze; 

	FindZipItem(hz,"sound.wav",true,&i,&ze);

	UnzipItemHandle(hz,i, hwrite);

	CloseHandle(hwrite);

	WaitForSingleObject(hthread,INFINITE);

	CloseHandle(hwrite); 

	CloseHandle(hthread);

	//   - finished -

	CloseZip(hz);

	// note: no need to free resources obtained through Find/Load/LockResource

(3) 获取zip的item

	SetCurrentDirectory("c:\\docs\\pipedzipstuff");

	HANDLE hread,hwrite; CreatePipe(&hread,&hwrite,0,0);

	CreateZipWriterThread(hwrite);

	HZIP hz = OpenZipHandle(hread,0);

	for (int i=0; ; i++)

	{ ZIPENTRY ze;

	  ZRESULT zr=GetZipItem(hz,i,&ze); 
	  if (zr!=ZR_OK) 
	  		break; // no more

	  UnzipItem(hz,i, ze.name);

	}

	CloseZip(hz);

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值