多文件的合并与分解
来源:互联网 发布:java 验证码识别 开源 编辑:程序博客网 时间:2024/05/18 08:11
多文件的合并与分解
作者:李斤询
源代码下载
本程序示例如何将多个文件合并成一个文件,并能够自分解。此技术在制作安装程序时非常有用。我在本网站学到了此技术,并将他整理扩展,能够合并文件和目录,个数不限。
核心程序包括一个合并文件类 CCombineFiles,一个分解文件的类 CExtractFiles 和一个表示文件或目录信息的数据类 FileInfo 文件和目录的信息都由FileInfo类表示。此类定义如下:
class FileInfo合并文件类CCombineFiles定义如下:
{
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
};
class CCombineFiles其中WriteFileInfo函数负责写入文件或目录的信息; WriteString负责写入一个字符串,字符串结构是“长度+字符列表"; WriteListInfo函数负责写入要合并的文件列表信息,他多次调用WriteFileInfo来完成; CombineFile负责写入文件数据; CombineFile负责写入一个目录的所有数据,它调用CombineFile和WriteListInfo来写入文件数据和目录中的文件列表信息。
{
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;
};
Combine函数是供外部调用的函数,它将fileList中的各个文件和目录都合并到szToFileName中去。
合并文件的算法思想是:各个文件的数据都放在合并后文件的开头,在合并后文件的结尾处存放合并前的文件列表;对这个目录合并后就当作一个单独的文件处理,只需在文件信息中指明这个文件分解后生成一个目录,然后其数据就是一个合并的文件;如此第归。
分解文件类CExtractFiles定义如下:
class CExtractFiles与合并文件类CCombineFiles一一对应,在合并中的合并函数对应都有其分解时的读取函数。这里就不多说了。
{
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);
CArraym_fileList;
CString m_filename;
};
举例:文件列表包括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";详细情况请参阅源代码。
- 多文件的合并与分解
- 多文件的合并与分解
- BGR分解与合并
- 轻松合并&分解mp3文件
- GDI+图像文件分解与合并
- 合并分解多个可执行文件为一个文件
- JAVA服务端多个文件合并传到客户端分解
- 文件的合并与分割
- 文件的合并与分割
- 文件的分割与合并
- 文件的分割与合并
- 文件的copy与合并
- 文件的分割与合并
- 文件的切割与合并
- 文件的分割与合并
- 文件的拆分与合并
- 文件的切割与合并
- 文件的分割与合并
- 使用ICallbackEventHandler接口实现的轻量级下拉框联动
- 客户关系管理CRM怎样做才能经济有效
- Subversion的备份
- PE文件格式详解(上)
- PE文件格式详解(下)
- 多文件的合并与分解
- cookies的常见用法
- 经济基础决定上层建筑!
- Asp.Net 文件操作基类
- Tiburon - new language features for Delphi 2009(有关泛型的)
- 文件操作 API 函数介绍
- MS SQL SERVER 2000不能进行自动备份的原因分析
- Flash8的ExternalInterface.addCallback
- isz的文件怎么打开