C++ zip檔案的解壓與壓縮
2、在專案中新增相關檔案
在Debug中新增zlib1.dll檔案,其他檔案載入到專案中
3、實現的程式碼
#pragma comment(lib,"zlib1")
//壓縮檔案
int Compress(char * DestName, const char *SrcName)
{
char SourceBuffer[102400] = { 0 }; //壓縮檔案時的源buffer
FILE* fp; //開啟欲壓縮檔案時檔案的指標
FILE* fp1; //建立壓縮檔案時的指標
errno_t err; //錯誤變數的定義
err = fopen_s(&fp, SrcName, "r+b");
//獲取檔案長度
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)
{
cout << "壓縮失敗:" << err << endl;
return 1;
}
//建立一個檔案用來寫入壓縮後的資料
err = fopen_s(&fp1, DestName, "w+b");
if (!fp1)
{
printf("壓縮檔案建立失敗! \n");
return 1;
}
fwrite(DestBuffer, SourceBufferLen, 1, fp1);
cout << "壓縮結束" << endl;
fclose(fp1);
return 0;
}
//解壓縮檔案
int UnCompress(char * DestName, const char *SrcName)
{
char uSorceBuffer[102400] = { 0 }; //解壓縮檔案時的源buffer
FILE* fp3; //開啟欲解壓檔案的檔案指標
FILE* fp4; //建立解壓檔案的檔案指標
errno_t err; //錯誤變數的定義
//開啟欲解壓的檔案
err = fopen_s(&fp3, SrcName, "r+b");
if (err)
{
printf("檔案開啟失敗! \n");
return 1;
}
//獲取欲解壓檔案的大小
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中的資料
/*
int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
uncompress 函式將 source 緩衝區的內容解壓縮到 dest 緩衝區。
sourceLen 是 source 緩衝區的大小(以位元組計)。注意函式的第二
個引數 destLen 是傳址呼叫。當呼叫函式時,destLen 表示 dest
緩衝區的大小, dest 緩衝區要足以容下解壓後的資料。在進行解
壓縮時,需要提前知道被壓縮的資料解壓出來會有多大。這就要求
在進行壓縮之前,儲存原始資料的大小(也就是解壓後的資料的大
小)。這不是 zlib 函式庫的功能,需要我們做額外的工作。當函式
退出後, destLen 是解壓出來的資料的實際大小。
*/
err = uncompress((Bytef*)uDestBuffer, (uLongf*)&uDestBufferLen, (Bytef*)uSorceBuffer, (uLongf)ufileLength);
if (err != Z_OK)
{
cout << "解壓縮失敗:" << err << endl;
return 1;
}
//建立一個檔案用來寫入解壓縮後的資料
err = fopen_s(&fp4, DestName, "wb");
if (err)
{
printf("解壓縮檔案建立失敗! \n");
return 1;
}
//printf("寫入資料... \n");
cout << "解壓資料成功!" << endl;
/*
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream );
這是fwrite的MSDN標準引數表,其中buffer是需要向檔案中寫入的內容在記憶體中的首地址指標,
size是待寫入內容的每個元素的位元組數,count是要寫多少個元素,stream 是檔案指標
*/
fwrite(uDestBuffer, uDestBufferLen, 1, fp4);
//cout << uDestBuffer << endl;
fclose(fp4);
return 0;
}