程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 使用微軟的FCI/FDI庫進行文件壓縮

使用微軟的FCI/FDI庫進行文件壓縮

編輯:關於VC++

現在所做的項目由於log內容太多,甚至到幾個G。所以,用戶要求程序能自動把產生的log壓縮,以利於保存和發送。本文簡單介紹一下微軟的FCI/FDI庫,希望對大家有所幫助。

簡介:

FCI(File Compression Interface)和FDI(File Decompression Interface)是由微軟提供的用於壓縮和解壓縮的開發包。最大的好處是在WinNT、Win2000、WinXP下系統都提供了相應的API接口。所以,我們的程序不需要額外的壓縮庫。

本文附帶例程只是給大家展示了一些比較簡單的用法,大家可以根據微軟提供的文檔,自己挖掘其他的更強大功能。

API介紹:

FCI/FDI API 用到大量的回調函數,具體函數的原型定義大家可以參考頭文件。

一、 FCI

FCI包括5個API。

FCICreate 創建 FCI context

FCIAddFile 向 cabinet 中添加文件

FCIFlushCabinet 結束當前的 cabinet

FCIFlushFolder 結束當前的folder 並建立新的 folder

FCIDestroy 銷毀 FCI context

HFCI DIAMONDAPI FCICreate(
  PERF       perf,      //用於返回錯誤類型
  PFNFCIFILEPLACED pfnfiledest,  //用在一個文件跨越多個cabinet時
     PFNFCIALLOC    pfnalloc,    //用來分配和釋放內存。
     PFNFCIFREE    pfnfree,
     PFNFCIOPEN    pfnopen,  //一下6個分別處理文件的創建、讀寫、
     PFNFCIREAD    pfnread,  //關閉、定位以及刪除等。
     PFNFCIWRITE    pfnwrite,
     PFNFCICLOSE    pfnclose,
     PFNFCISEEK    pfnseek,
  PFNFCIDELETE   pfndelete,
     PFNFCIGETTEMPFILE pfnfcigtf,  //用於產生臨時文件名
     PCCAB       pccab,  //是一個CCAB結構的指針對壓縮文件的詳細描述
          //比如:大小、名稱、路徑等。
  void FAR *    pv      //返回一些context 參數。
);
BOOL DIAMONDAPI FCIAddFile(
  HFCI         hfci,  //由FCICreate創建的context
     char         *pszSourceFile,//被壓縮的文件
     char         *pszFileName,//此文件在壓縮包中的名稱
     BOOL         fExecute,  //解壓時文件是否執行
     PFNFCIGETNEXTCABINET GetNextCab,//創建下一個cabinet時調用,這裡忽略
     PFNFCISTATUS     pfnProgress,//周期性的回調函數,可以顯示壓縮的進度。
     PFNFCIGETOPENINFO   pfnOpenInfo,//打開文件返回文件句柄及屬性
    TCOMP         typeCompress  //壓縮的類型
)
BOOL DIAMONDAPI FCIFlushCabinet(
  HFCI         hfci,     //由FCICreate創建的context
     BOOL         fGetNextCab, //決定GetNextCab是否被調用
     PFNFCIGETNEXTCABINET GetNextCab,//當cabinet滿的時候調用
     PFNFCISTATUS     pfnProgress //同FCIAddFile
)
BOOL DIAMONDAPI FCIFlushFolder(
  HFCI         hfci,      //參數同上
  PFNFCIGETNEXTCABINET GetNextCab,
  PFNFCISTATUS     pfnProgress
)

BOOL DIAMONDAPI FCIDestroy(
  HFCI  hfci
)

二、 FDI

FDI包括4個API。

FDICreate 創建 FDI context

FDIIsCabinet 判斷是否為CAB壓縮文件,是則返回其屬性

FDICopy 解壓

FDIDestroy 銷毀 FDI context

HFCI DIAMONDAPI FDICreate(//參數與FCI相應參數差不多
  PFNALLOC     pfnalloc,
  PFNFREE     pfnfree,
  PFNOPEN     pfnopen,
  PFNREAD     pfnread,
  PFNWRITE     pfnwrite,
  PFNCLOSE    pfnclose,
  pfnseek,
  int      cpuType,// CPU類型,32位FDI忽略此參數
  PERF      perf
)
BOOL DIAMONDAPI FDIIsCabinet(
  HFDI       hfdi,    //FDI context
  int       hf,       //打開的文件句柄
  PFDICABINETINFO   pfdici  //返回壓縮文件的一些屬性
)
BOOL FAR DIAMONDAPI FDICopy(
  HFDI     hfdi,
  char FAR   *pszCabinet, //待解壓文件名
  char FAR   *pszCabPath, //待解壓文件的路徑
  int      flags,   //保留,現在必須為0
  PFNFDINOTIFY pfnfdin,  //回調函數,用來處理FDI的通知
  PFNFDIDECRYPT pfnfdid,  //保留,現在必須為NULL
  void FAR   *pvUser   //作為參數傳給回調函數pfnfdin,這裡設為NULL
)

注意事項:

1、 用到的庫CABINET.DLL,在安裝操作系統時已經有了。我們可以用它生成lib庫,具體方法可以參照《VC知識庫》第二十期。

2、 一個context只能在創建他的線程使用,如果要使用多線程必須創建多個context。

3、 水平有限,具體以微軟提供的文檔為准。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved