在軟體開發中,將多個檔案與目錄打包成單一檔案並支援自動分解,是安裝程式製作的關鍵技術。本文深入解析一套完整的多檔案合併與分解方案,核心由三個類別構成:FileInfo 描述檔案/目錄元資料,CCombineFiles 負責合併,CExtractFiles 負責分解,支援無限層級的目錄遞迴處理。
FileInfo 統一表示檔案與目錄資訊,包含檔名、大小、位移及類型標識('d'=目錄, 'f'=檔案)。建構子允許指定預設類型,賦值運算子支援深複製。
合併演算法採用「資料前置、索引後置」策略:所有檔案資料依序寫入目標檔案頭部,檔案列表資訊(含目錄結構)寫入尾部。關鍵方法包括:
WriteFileInfo:序列化單個檔案/目錄元資料WriteString:以「長度+字元陣列」格式寫入字串WriteListInfo:遞迴寫入目錄下所有項目資訊CombineFile/CombineDirectory:分別處理檔案資料與目錄遞迴合併Combine 為對外介面,接收檔案清單陣列與目標檔名,自動完成全量打包。
分解過程反向操作:從檔案尾部讀取索引列表,依元資料中的位移與大小定位資料區塊,按原始路徑還原檔案與目錄結構。核心方法與合併類一一對應:ReadFileInfo、ReadString、ReadListInfo、ExtractFile、ExtractDirectory。
假設包含檔案 f1,f2,f3 與目錄 D(內含 f4,f5),合併順序為:先寫入 D 目錄下檔案資料與索引,再寫入根層檔案資料,最後寫入根層索引。分解時從尾部索引入手,逐層還原。
將合併後檔案副檔名改為 .exe,並在啟動碼中指定解壓縮引導程式路徑(如 szExeName = "G:\\COM\\TestEvent\\TestBp\\bp.exe"),即可生成可執行自解壓安裝包。完整原始碼可從 VCKbase 下載。