中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 文件系统
多文件的合并与分解
作者:未知 时间:2005-07-20 14:21 出处:VC知识库 责编:chinaitpower
              摘要:多文件的合并与分解

多文件的合并与分解

作者:李斤询


源代码下载

  本程序示例如何将多个文件合并成一个文件,并能够自分解。此技术在制作安装程序时非常有用。我在本网站学到了此技术,并将他整理扩展,能够合并文件和目录,个数不限。
  核心程序包括一个合并文件类 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";
详细情况请参阅源代码。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有