65.9K
CodeProject 正在变化。 阅读更多。
Home

用于分割和合并文件的类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (7投票s)

2002 年 8 月 13 日

3分钟阅读

viewsIcon

83583

downloadIcon

3021

本文介绍两个类,一个用于将文件分割成较小的块,另一个用于将较小的文件合并成一个文件。 还有一个使用这些类编写的实用程序。

引言

本文解释了两个类 CFileSplitCFileMerge

CFileSplit

此类用于将文件分割成多个部分。 有两种方法可以使用它来分割文件: - 分割成固定数量的文件,或分割成每个文件具有特定大小的文件。 该类派生自 CWinThread 类。 将其实现为线程意味着 -

  1. 使用此类的任何应用程序在处理时都不会冻结
  2. 您可以取消长时间的分割过程。 此外,线程会将消息发送回调用窗口,指示分割或合并过程的进度。

使用 CFileSplit 非常简单。 在您的项目中包含FileSplit.hFileSplit.cpp 文件。 使用 AfxBeginThread 函数创建 CFileSplit 对象,并设置输入文件名、输出目录以及分割方式(即固定数量的文件或固定大小的文件)。 另外,将 CWinThread 对象的 m_pMainWnd 成员设置为当前窗口。 这将使其能够将消息发送回该窗口。

CFileSplit *m_pFS;
	
.
.
.

m_pFS = (CFileSplit*)(AfxBeginThread(RUNTIME_CLASS(CFileSplit)));
m_pFS->m_pMainWnd = this;
m_pFS->m_InputFileName = m_InputFile;
m_pFS->m_OutputDirName = m_OutputDir;
m_pFS->m_nSplitMode    = 0;
m_pFS->m_nSplitVal     = 12;

m_nSplitMode 成员指示如何分割。 0 表示分割成固定数量的文件,在这种情况下,文件数量将位于 m_nSplitVal 中。 如果 m_nSplitMode 为 1,则表示分割成固定大小的文件,在这种情况下,m_nSplitVal 将包含每个输出文件的大小(以字节为单位)。

要启动分割过程,请向 CFileSplit 对象发送 WM_FS_START 消息。 WM_FS_START 是在FileSplit.h 中定义的应用程序定义消息

m_pFS->PostThreadMessage(WM_FS_START,0,0);

线程将在完成文件分割后自行销毁。

如果您想跟踪分割过程的进度,CFileSplit 线程将向您发送 WM_FS_UPDATESTATUS 消息。 此消息的 WPARAM 将包含进度百分比。 分割完成后,LPARAM 将设置为 1。 您可以在您的应用程序中处理此消息; 在您的消息映射中,添加以下内容:-

BEGIN_MESSAGE_MAP(CFileSplitPage, CPropertyPage)
    //{{AFX_MSG_MAP(CFileSplitPage)
    .
    .
    .
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_FS_UPDATESTATUS, OnUpdateStatus)
END_MESSAGE_MAP()

其中 OnUpdateStatus 是处理函数,声明为

afx_msg void OnUpdateStatus(WPARAM wP, LPARAM lP);

CFileMerge

此类执行与上述相反的操作; 它获取一堆文件并将它们组合成一个文件。 (DOS 中的 copy /b 命令也可以做同样的事情)。 它的实现方式类似于 CFileSplit,可以按如下方式使用

CFileMerge *m_pFM;
.
.
.
m_pFM = (CFileMerge*)AfxBeginThread(RUNTIME_CLASS(CFileMerge));
m_pFM->m_pMainWnd=this;
m_pFM->m_InFiles.Copy(arr);

m_InFiles 成员是一个 CStringArray,其中包含要组合的输入文件列表,按它们要组合的顺序排列。

m_pFM->m_OutFile = m_OutFile;
m_pFM->PostThreadMessage(WM_FM_START,0,0);

您发送一个 WM_FM_START 消息来启动该过程。 类似于 CFileSpit,您会收到一个 WM_FM_UPDATESTATUS 消息,指示合并的进度。

示例应用程序

提供的示例应用程序是使用上述类编写的。 这是一个基于对话框的应用程序,但我将主对话框类更改为从 CPropertySheet 而不是 CDialog 派生,并将分割和合并作为两个页面添加到它。(正如您所看到的,我无法从属性表中删除“帮助”按钮,也无法添加最小化按钮)。

从“分割”页面,您可以选择要分割的文件,选择输出目录,然后点击“开始”按钮。 该应用程序创建带有编号扩展名的文件(outfile.ext.1、outfile.ext.2 等...)

从“合并”页面选择输入文件。 添加文件时,它会尝试根据扩展名(如果已编号)进行排序。 如果它们的顺序不正确,您可以上下移动它们。 点击“开始”按钮开始合并。 在长时间的分割或合并过程中,您可以点击“取消”按钮停止该过程。

历史

2002 年 8 月 17 日 - 更新了下载

© . All rights reserved.