專案中 Log 檔動輒數 GB,使用者要求自動壓縮以利保存與傳輸。本文介紹 Microsoft 提供的 FCI (File Compression Interface) 與 FDI (File Decompression Interface) 函式庫,這些 API 在 Windows NT/2000/XP 內建支援,無需額外第三方函式庫。
FCI/FDI 為 Microsoft 官方提供的壓縮/解壓縮開發套件,大量使用回呼函數機制。最大優勢在於系統內建對應 API,部署極為輕量。
FCI 包含 5 個核心 API:
| 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, // 檔案建立/讀寫/關閉/定位/刪除
PFNFCIREAD pfnread,
PFNFCIWRITE pfnwrite,
PFNFCICLOSE pfnclose,
PFNFCISEEK pfnseek,
PFNFCIDELETE pfndelete,
PFNFCIGETTEMPFILE pfnfcigtf, // 產生暫存檔名
PCCAB pccab, // 壓縮檔詳細描述 (大小、名稱、路徑)
void FAR * pv // context 參數
);
BOOL DIAMONDAPI FCIAddFile(
HFCI hfci, // FCICreate 建立的 context
char *pszSourceFile, // 待壓縮檔案
char *pszFileName, // 壓縮包內檔名
BOOL fExecute, // 解壓時是否執行
PFNFCIGETNEXTCABINET GetNextCab,
PFNFCISTATUS pfnProgress, // 進度回呼
PFNFCIGETOPENINFO pfnOpenInfo,// 開啟檔案回傳 handle 與屬性
TCOMP typeCompress // 壓縮類型
);
FDI 包含 4 個核心 API:
| API | 功能說明 |
|---|---|
FDICreate | 建立 FDI context |
FDIIsCabinet | 判斷是否為 CAB 檔,回傳屬性 |
FDICopy | 解壓縮 |
FDIDestroy | 銷毀 FDI context |
HFDI DIAMONDAPI FDICreate(
PFNALLOC pfnalloc,
PFNFREE pfnfree,
PFNOPEN pfnopen,
PFNREAD pfnread,
PFNWRITE pfnwrite,
PFNCLOSE pfnclose,
PFNSEEK pfnseek,
int cpuType, // CPU 類型,32 位元忽略
PERF perf
);
BOOL DIAMONDAPI FDIIsCabinet(
HFDI hfdi, // FDI context
int hf, // 開啟的檔案 handle
PFDICABINETINFO pfdici // 回傳壓縮檔屬性
);
BOOL FAR DIAMONDAPI FDICopy(
HFDI hfdi,
char FAR *pszCabinet, // 待解壓檔名
char FAR *pszCabPath, // 待解壓檔案路徑
int flags, // 保留,必為 0
PFNFDINOTIFY pfnfdin, // 通知處理回呼
PFNFDIDECRYPT pfnfdid, // 保留,必為 NULL
void FAR *pvUser // 傳給回呼的使用者參數
);
CABINET.DLL 系統內建,可自行產生 import library (參考《VC 知識庫》第二十期)本文附帶範例僅示範基礎用法,開發者可依官方文件深入挖掘更進階功能,如多 cabinet 跨檔壓縮、進度顯示、記憶體壓縮等。