本文簡單介紹一下微軟的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,在安裝作業系統時已經有了。
2、 一個context只能在建立他的線程使用,如果要使用多線程必須建立多個context。