(一)编程原理:?
文件分割实际上就是将目标文件用二进制读写的方法,精确的连续保存为合适大小的独立文件,一般来说,分割后的文件在正确组装前是不能被使用的。?
文件还原是文件分割的逆过程,即是将分割后的文件严密的按照分割顺序用二进制读写的方法写入一个同一个文件的过程,只要程序算法和逻辑正确严密,分割前和分割后的文件是没有一个字节的差别的。?
之所以使用双通道技术是因为当被分割的文件较大或者非常大(远远大于内存)时,使用单个文件通道定义的内存二进制缓冲数组非常容易造成内存的用尽而导致操作失败,另一方面,它的处理速度和可靠性也是非常令人担忧的。?
编程思路是,首先使用双通道技术将目标文件分割成指定大小的文件,扩展名依次是“指定文件名+.源文件扩展名+.分割序号”,并且生成一个还原信息文件“被分割文件名.hj”,该文件将记录文件分割的有关信息;文件还原时,同样利用双通道,按照在还原信息文件中登记的信息,将待还原的文件写入同一个文件中。?
(二)编程实践:?
(1)启动vb6,建立一个标准exe工程,添加一个窗体form1,添加microsoft?common?dialog?control?6.0控件,命名为cod1;添加两个frame控件(frame1的caption=“文件分割”,frame2的caption=“文件还原”);添加五个标签框,caption属性依次为“被分割文件名”、“分割后文件大小”、“分割后文件保存在”、“单位:bytes字节”、“还原信息文件名”、“还原后文件保存在”;由上至下一次添加四个caption=“浏览...”的命令按钮command1、command2、command3、command4;由上至下依次添加5个textbox按钮txtFileName、txtFileLength、Txtoutname、txtTemplateName、txtOutputFile;添加两个命令按钮cmdsplit,caption=“开始分割”、cmdunsplit,caption=“开始还原”;两个命令按command5、command6用来指示操作执行进度。代码如下:?
Option?Explicit?
Private?Sub?cmdSplit_Click()?’文件分割?
Dim?err_descr?As?String?’定义接收返回错误码的字符串变量?
If?Not?SplitFile(txtFileName.Text,0,err_descr,CLng(txtFileLength.Text),Txtoutname.Text)?Then?
MsgBox?"文件操作产生了错误——"?&?err_descr,vbExclamation?
Else?
MsgBox?"文件分割操作已经圆满完成!"?
End?If?
End?Sub?’当splitfile公用过程返回值=true表示操作成功,否则失败并返回错误简短的提示?
Private?Sub?cmdUnsplit_Click()?’文件还原?
Dim?err_descr?As?String?
If?Not?ReassembleFile(txt?TemplateName.Text,False,txtOutputFile.Text)?Then?
MsgBox?"文件操作产生了错误——"?&?err_descr,vbExclamation?
Else?
MsgBox?"文件还原操作已经圆满完成!"?
End?If?
End?Sub?’当ReassembleFile公用过程返回值=true表示操作成功,否则失败并返回错误简短的提示?
Private?Sub?Command1_Click()?’选择被分割文件?
CoD1.Filter="所有格式文件*.*|*.*"?
CoD1.ShowOpen?
If?CoD1.FileName""?Then?
txtFileName.Text=CoD1.FileName?
End?If?’如果未选中文件就退出过程?
End?Sub?
Private?Sub?Command2_Click()?’分割后文件保存路径名称?
With?CoD1?
If?txtFileName.Text=""?Then?
MsgBox?"请首先选择一个被分割文件!"?
Exit?Sub?
End?If?’如果未选定被分割文件退出过程?
.ShowSave?
If?.FileName""?Then?
Txtoutname.Text=.FileName?
End?If?’如果未指定保存文件名退出?
End?With?
End?Sub?
Private?Sub?Command3_Click()?’传回还原信息文件名?
With?CoD1?
.FileName=""?
.Filter="还原信息文件*.hj|*.hj"?’只显示*.hj还原信息文件?
.ShowOpen?
If?.FileName""?Then?
txtTemplateName.Text=.FileName?
End?If?
End?With?
End?Sub?
Private?Sub?Command4_Click()?’得到并计算还原后文件名、扩展名?
Dim?g?
With?CoD1?
If?txtTemplateName.Text=""?Then?
MsgBox?"请首先选择一个还原信息文件!"?
Exit?Sub?’如果还原信息文件未被选中,则退出过程?
End?If?
.Filter=""?
.FileName=""?’清空过期文件名和类型指针?
.ShowSave?
If?.FileName""?Then?
g=InStr(1,txtTemplateName.Text,".")?’查找第一个“.”?
txtOutputFile.Text=.FileName?&?Mid?
(txtTemplateName.Text,g,4)?’返回文件的用户指定名称和原扩展名?
End?If?
End?With?
End?Sub?
Private?Sub?Form_Load()?
Me.Left=(Screen.Width-Me.Width)/2?
Me.Top=(Screen.Height-Me.Height)/2?’窗体居中?
Me.Caption=App.Title?’初始化标题栏?
End?Sub?’主程序结束?