充電 庫 Zlib檔案壓縮和解壓

2021-09-07 07:11:46 字數 3573 閱讀 3535

開源**:

zlib使用手冊:manual.html

zlib wince版:

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

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

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

<<<<<<<<

第三步: 包含標頭檔案

#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);

return0;

}

解壓

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);

return0;

}

測試**:

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檔案壓縮和解壓 開源 http www.zlib.net zlib使用手冊 http www.zlib.net manual.html zlib wince版 http www.tenik.co.jp adachi wince 在這裡,你可以檢視基於各種作業系統平台的壓縮與解縮 實現。以下是...

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...

檔案壓縮和解壓

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...