使用微軟的FCI FDI庫進行檔案壓縮

2021-04-14 02:43:09 字數 3493 閱讀 9192

空  瀏覽次數:

36  文字大小:【

大】【中】【

小】關鍵字:使用微軟的fci/fdi庫進行檔案壓縮

使用微軟的fci/fdi庫進行檔案壓縮

簡介:fci(file compression inte***ce)和fdi(file decompression inte***ce)是由微軟提供的用於壓縮和解壓縮的開發包。最大的好處是在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、 水平有限,具體以微軟提供的文件為準。

pyltp庫的使用進行文字分析

pyltp目前支援puthon3.6不支援3.7 用python3.7安裝了很久都沒有安裝成功 無奈換成了3.6 from pyltp import sentencesplitter sents sentencesplitter.split 元芳你怎麼看?我就趴視窗上看唄!分句 切割句子。分詞 im...

Flutter 使用http庫進行檔案上傳

實際開發中,我們會用到檔案上傳功能,這裡通過簡單的 演示,達到實際開發中快速使用的目的 如果需要對獲取的值進行處理可以採取這種方式 await for string value in response.stream.transform utf8.decoder 如果只需要乙個值的話,可以使用這種方式...

使用filter進行文字替換

問題描述 filter的使用很簡便,如下示例為檔案拷貝過程中進行文字替換。可以很簡便的設定begintoken及endtoken來定義要被替換的文字的前後定界符,預設為 可以自定義其他定界符。然而,當我們的文字中沒有!等特殊符號時該怎麼辦呢,如下面的oldfile.txt.fowjow was ho...