1. 程式人生 > >C++ zip檔案的解壓與壓縮

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