首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

使用 Microsoft FCI/FDI 函式庫實作檔案壓縮與解壓縮

     編輯:關於VC++

前言

專案中 Log 檔動輒數 GB,使用者要求自動壓縮以利保存與傳輸。本文介紹 Microsoft 提供的 FCI (File Compression Interface) 與 FDI (File Decompression Interface) 函式庫,這些 API 在 Windows NT/2000/XP 內建支援,無需額外第三方函式庫。

FCI/FDI 簡介

FCI/FDI 為 Microsoft 官方提供的壓縮/解壓縮開發套件,大量使用回呼函數機制。最大優勢在於系統內建對應 API,部署極為輕量。

FCI 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 API - 解壓縮功能

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              // 傳給回呼的使用者參數
);

注意事項

  1. 相依函式庫:CABINET.DLL 系統內建,可自行產生 import library (參考《VC 知識庫》第二十期)
  2. 執行緒限制:單一 context 僅能在建立它的執行緒使用,多執行緒需建立多個 context
  3. 文件為準:具體參數與行為請以 Microsoft 官方文件為準

結語

本文附帶範例僅示範基礎用法,開發者可依官方文件深入挖掘更進階功能,如多 cabinet 跨檔壓縮、進度顯示、記憶體壓縮等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved