程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 多文件的合並與分解

多文件的合並與分解

編輯:關於VC++

本程序示例如何將多個文件合並成一個文件,並能夠自分解。此技術在制作 安裝程序時非常有用。我在本網站學到了此技術,並將他整理擴展,能夠合並文 件和目錄,個數不限。

核心程序包括一個合並文件類 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 或者用自己壓縮包的

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved