Visual C++编程经验(下)(3)
或者是:
ARJ E -V1440 被解压缩文件的路径名+文件名 解压缩后文件的路径名+文件名 -Y -JM
DIR >临时文件名
2. 在需要调用ARJ.EXE进行压缩/解压缩的类中,再创建一个成员函数,不妨称作RunBat(),其作用是创建和执行进程来运行上述所生成的批处理文件,并在适当时候撤消进程。
3. 同时按下Ctrl和W键或直接单击工具条上的ClassWizard按钮,打开ClassWizard对话框。在类名(Class name)列表框中选择需要调用ARJ.EXE进行压缩/解压缩的类,在Object IDs列表框中选择该类的类名,在消息(Messages)列表框中选择WM_TIMER消息并双击它,这时ClassWizard就会在该类中加入一个OnTimer()函数。该函数将以一定的时间间隔检查压缩/解压缩程序是否已经执行完毕,即检查作为标志的临时文件是否已经存在,并及时修改状态变量“Search”,以便通知RunBat()函数结束进程。
void CMyCompress::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CFile file;
CFileException Error;
if (file.Open(ExitFlag,CFile::modeRead,&Error)) {
Search=FALSE;
file.Close();
}
}
得到并修改各驱动器信息
在设计与文件输入/输出有关的应用程序时,我们需要在输入/输出文件前,了解一下源驱动器或者目标驱动器的各项信息,比如是否有磁盘在软驱中、它是否已打开写保护、现有磁盘的容量等。遗憾的是,MFC类库中没有提供支持这些功能的类,所以我们只能通过Win32 提供的函数来完成我们的要求。下面,笔者根据自己的编程实践,通过几段程序,来说明如何利用Win32提供的函数实现对驱动器的操作。读者可以根据自己的需要,把介绍的函数稍加修改后,即可插入到自己设计的应用程序中去。
*S FindDriverInfo()函数的功能是搜索计算机中所有驱动器,选择出其中软盘驱动器的驱动器号,依次加入到一个下拉列表框中。
*S EmptyDiskSpace()函数主要负责清空指定驱动器中的磁盘,同时它还负责记录指定驱动器中磁盘的容量,并得到该磁盘的序列号。在该函数中,还将调用上文中的DeletTree()的PreRemoveDirectory()函数,来完成清空工作。
*S 在MS-DOS和Windows95中,磁盘卷标最多由11个字符组成,并且字母的大小写不加区分。当需要设定指定驱动器中磁盘的卷标时,只要调用Win32的SetVolumeLabel()函数即可,在第一个参数中指明磁盘所在的驱动器号,在第二个参数中指明新的卷标号,例如:SetVolumeLabel(DriverNum, NewVolumeLabel)。
自编删除目录及其下属文件的函数
高版本的MS-DOS和Windows 95都提供了一个可以删除一个或多个目录及其下属文件和目录的命令,即DeleteTree命令。然而,无论在MFC类库还是在Win32函数库中,都没有相应的函数。这样,当我们在自己设计的应用程序中需要用到DeleteTree的功能时,自然想到的方法是通过进程调用或者系统调用的方式(如上文所述)调用MD-DOS或Windows 95下的DeleteTree命令。但实际上,Win32函数库已经为我们提供了其它的用于文件和目录操作的函数,利用它们不难设计出自己的DeleteTree()函数。
读者也许会感到有些疑惑,为什么前文强调进程调用优于自我设计的函数,而这里又反了过来?是的,在通常情况下,调用应用程序内部的函数比使用进程或者调用外部函数更灵活并且可以提高执行效率,也便于修改,DeleteTree()就是这种情况。然而,像设计压缩/解压缩这样的函数工作量大、算法复杂,而且调试和维护也需要一定代价,于是这时候还是采用“拿来主义”为好。
本文给出笔者设计的DeleteTree()函数,仅供参考。

