本程序示例如何將多個文件合並成一個文件,並能夠自分解。此技術在制作 安裝程序時非常有用。我在本網站學到了此技術,並將他整理擴展,能夠合並文 件和目錄,個數不限。
核心程序包括一個合並文件類 CCombineFiles,一個分解文件的類 CExtractFiles 和一個表示文件或目錄信息的數據類 FileInfo 文件和目錄的信 息都由FileInfo類表示。此類定義如下: class FileInfo
{
public:
const FileInfo &operator = (const FileInfo &fi);
FileInfo(CString szFileName, UINT nFileSize, UINT nPos, char type = 0);
FileInfo();
virtual ~FileInfo();
public:
CString szFileName;
UINT nSize;
UINT nPos;
char type; // d --- directory , f --- file , other --- no define
};
合並文件類CCombineFiles定義如下:
class CCombineFiles
{
public:
bool Combine(CStringArray &fileList, CString szToFileName);
CCombineFiles(CString szExeFileName);
virtual ~CCombineFiles();
public:
bool WriteFileInfo(FileInfo fi, FILE *fp);
bool WriteString(CString szStr, FILE *fp);
bool WriteListInfo(CArray &fiList, FILE *fp, UINT nStartOffset);
bool CombineFile(CString szFileName, FILE *fp);
bool CombineDirectory(CString szDir, FILE *fp);
CString m_szExeFileName;
};
其中WriteFileInfo函數負責寫入文件或目錄的信息; WriteString負責寫入一個字符串,字符串結構是“長度+字符列表" ; WriteListInfo函數負責寫入要合並的文件列表信息,他多次調用 WriteFileInfo來完成; CombineFile負責寫入文件數據; CombineFile負責寫 入一個目錄的所有數據,它調用CombineFile和WriteListInfo來寫入文件數據和 目錄中的文件列表信息。
Combine函數是供外部調用的函數,它將fileList中的各個文件和目錄都合並 到szToFileName中去。
合並文件的算法思想是:各個文件的數據都放在合並後文件的開頭,在合並 後文件的結尾處存放合並前的文件列表;對這個目錄合並後就當作一個單獨的文 件處理,只需在文件信息中指明這個文件分解後生成一個目錄,然後其數據就是 一個合並的文件;如此第歸。
分解文件類CExtractFiles定義如下:
class CExtractFiles
{
public:
bool ExtractFiles(CArray &fiList, CString szPath);
bool ReadFileList(CArray &fileList);
CExtractFiles(CString filename);
virtual ~CExtractFiles();
public:
bool ExtractDirectory(FileInfo fi, CString szPath, FILE *fp);
bool ExtractFile(FileInfo fi, CString szPath, FILE *fp);
bool ReadString(CString &szStr, FILE *fp);
bool ReadFileInfo(FileInfo &fi, FILE *fp);
bool ReadListInfo(CArray &fiList, FILE *fp, UINT &nStartOffset);
bool ReadFileList(CArray &fiList, FileInfo dir);
CArray m_fileList;
CString m_filename;
};
與合並文件類CCombineFiles一一對應,在合並中的合並函數對應 都有其分解時的讀取函數。這裡就不多說了。
舉例:文件列表包括f1,f2,f3三個文件和目錄D,目錄D中有兩個文件f4,f5。 設合並後文件名為Combine。則合並過程如下:
首先合並目錄D中的f4和f5,將他兩個的數據寫入Combine;然後將f4和f5的 文件信息寫入Combine;然後將f1,f2,f3的文件數據寫入Combine;最後將文件 f1,f2,f3和目錄D的文件信息寫入Combine。至此和並完成。
分解時從後往前讀取文件信息,根據文件信息來讀取文件的數據,寫入分解 後的文件中去。
要想合並自分解文件只需將合並的文件的擴展名設為exe,並且把 TestBpDlg.cpp文件中的205行指定到你編譯出的bp.exe的路徑去就可以了。例如 :
szExeName = "G:\\COM\\TestEvent\\TestBp\\bp.exe";
詳細情況請參閱源 代碼。
源代碼下載:http://www.vckbase.com/code/downcode.asp?id=2425 或者用自己壓縮包的
本文配套源碼