Zlib檔案壓縮和解壓

2021-05-23 06:32:46 字數 3508 閱讀 8576

zlib檔案壓縮和解壓

開源**:http://www.zlib.net/

zlib使用手冊:http://www.zlib.net/manual.html

zlib wince版:http://www.tenik.co.jp/~adachi/wince/

在這裡,你可以檢視基於各種作業系統平台的壓縮與解縮**實現。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

以下是經過測試的 wince 及 winxp 下的**

<<<<<<<<

winxp: 解壓縮後開啟zlib-1.2.3/projects/visualc6/zlib.dsw,選擇win32 lib release 按f7編繹生成zlib.lib, zlib.dll.

<<<<<<<<

第二步: 建立evc 或者 vs2005 的對話方塊工程.

在工程中新增以下檔案:zlib.h, zconf.h, zlib.lib, zlib.dll (或者 zlibce.dll);

<<<<<<<<

第三步: 包含標頭檔案

#include "zlib.h"

主要使用fopen等c標準介面實現的,只用到zlib的compress()和uncompress()介面;裡面的條件編譯是針對pc和wce的

封裝的類:

class czlib

;介面實現:

壓縮int czlib::compress(char * destname,const char *srcname)

;  //壓縮檔案時的源buffer

file* fp;  //開啟欲壓縮檔案時檔案的指標

file* fp1;  //建立壓縮檔案時的指標 

errno_t err; //錯誤變數的定義

#ifdef windows_platform

err = fopen_s(&fp,srcname,"r+b");//開啟欲壓縮的檔案

if(err)

#endif 

#ifdef    windows_ce_platform

fp = fopen_s(srcname,"r+b");//開啟欲壓縮的檔案

if(fp)

#endif 

//獲取檔案長度

long cur = ftell(fp);

fseek(fp,0l,seek_end);

long filelength = ftell(fp);

fseek(fp,cur,seek_set);

//讀取檔案到buffer

fread(sourcebuffer,filelength,1,fp);

fclose(fp);

//壓縮buffer中的資料

ulongf sourcebufferlen=102400;

char* destbuffer=(char*)::calloc((uint)sourcebufferlen, 1);

err=compress((bytef*)destbuffer,(ulongf*)&sourcebufferlen,(const bytef*)sourcebuffer,(ulongf)filelength);

if(err!=z_ok)

//建立乙個檔案用來寫入壓縮後的資料

err = fopen_s(&fp1, destname,"w+b");

if(!fp1)

fwrite(destbuffer,sourcebufferlen,1,fp1);

fclose(fp1);

return 0;}解壓

int czlib::uncompress(char * destname,const char *srcname)

;  //解壓縮檔案時的源buffer

file* fp3;  //開啟欲解壓檔案的檔案指標

file* fp4;  //建立解壓檔案的檔案指標

errno_t err; //錯誤變數的定義

//開啟欲解壓的檔案

err = fopen_s(&fp3,srcname,"r+b");

if(err)

//獲取欲解壓檔案的大小

long ucur = ftell(fp3);

fseek(fp3,0l,seek_end);

long ufilelength = ftell(fp3);

fseek(fp3,ucur,seek_set);

//讀取檔案到buffer

fread(usorcebuffer,ufilelength,1,fp3);

fclose(fp3);

ulongf udestbufferlen=1024000;//此處長度需要足夠大以容納解壓縮後資料

char* udestbuffer=(char*)::calloc((uint)udestbufferlen, 1);

//解壓縮buffer中的資料

err=uncompress((bytef*)udestbuffer,(ulongf*)&udestbufferlen,(bytef*)usorcebuffer,(ulongf)ufilelength);

if(err!=z_ok)

//建立乙個檔案用來寫入解壓縮後的資料

err = fopen_s(&fp4,destname,"wb");

if(err)

printf("寫入資料... /n");

fwrite(udestbuffer,udestbufferlen,1,fp4);

fclose(fp4);

return 0;

}測試**:

test.compress("1.zip","test.docx");

test.uncompress("11.docx","1.zip");

上述**對於大檔案就不適合了,因為是一次讀出,一次寫入的,下面是針對大檔案的改進,分批讀,分批寫,**如下:

wf_error czlib::compress(const char * destname,const char *srcname)

/gzfile out = gzopen(destname,"wb6f");

if(out == null)

for(;;)

if(len == 0) break;

if(gzwrite(out, buf, (unsigned)len) != len)

}gzclose(out);

fclose(fp_in);

return re;

}wf_error czlib::uncompress(const char * destname,const char *srcname)

if(null == (fp_out = fopen(destname,"wb")))

for (;;)

if(len == 0) break;

if(fwrite(buf,1,(unsigned)len,fp_out)!=len)

}fclose(fp_out);

gzclose(in);

return re;

}

充電 庫 Zlib檔案壓縮和解壓

開源 zlib使用手冊 manual.html zlib wince版 在這裡,你可以檢視基於各種作業系統平台的壓縮與解縮 實現。以下是經過測試的 wince 及 winxp 下的 第三步 包含標頭檔案 include zlib.h 主要使用fopen等c標準介面實現的,只用到zlib的compre...

檔案壓縮和解壓

1.zip命令 zip r a.zip a 將a資料夾壓縮成a.zip zip r abcdef.zip abc def.txt 這句命令的意思是將資料夾abc和檔案def.txt壓縮成乙個壓縮包abcdef.zip 2.unzip命令 unzip mysql.zip 在當前目錄下直接解壓mysql...

zlib庫的使用,可以壓縮和解壓資料夾

源 ziphelper.h pragma once ifndef zip h define zip h include include include include include include zlib unzip.h include using namespace std class cpa...