現在所做的項目由於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、 水平有限,具體以微軟提供的文檔為准。
本文配套源碼