<br> <br> <br><br>一步一步做文件切割器<br>2001年10月5日 <br> <br>作者:许晋军 XuJinjun@china.com <br><br>有时候我们需要把文件分成比较小的多个,方便网络传输或者磁盘拷贝,有的共享软件可以完成这样的功能,但是有大小限制和多种错误。下面我们用Delphi 4.0 来做这样一个软件: <br>界面设计: <br><br><br><br><br>创建主窗体 XCutForm,保存应用程序为 Xcut.dpr <br>1.选取文件 <br><br>选取文件就是要弹出一个文件选取对话框给用户一个选择的机会,在Delphi中很容易实现,在Dialog对话框选取项中选取OpenDialog 放到窗体中,名称为OpenDialog. <br>编辑OpenDialog的Filter 属性,如下图所示: <br><br><br><br><br>2.文件切割大小 <br>放置一个PageControl 控件在主窗体中,添加两个 TabSheet ,分别为 Tbs1和Tbs2. <br>在Tbs1上放一个RadioGroup,名称为rdgCut,编辑RadioGroup控件的属性,如下图所示: <br><br><br><br><br>给用户一个选取常用文件大小的列表 <br><br><br><br><br>在Tbs2上放一个输入框,让用户可以自己设定文件大小: <br>3.指定切割文件存放位置(目标文件夹) <br><br>对于选取一个目标文件夹的对话框,在Delphi中没有直接支持,我们可以启用Com扩展打开Windows的标准打开文件夹对话框。为了方便使用,我们把它封装成一个方便使用的单元BrowseFolder(详见程序清单),在调用的时候只需要几行代码 <br><br>Procedure <br>var <br>dlg: TBrowseForFolderDialog; <br>DestPath:string; <br>begin <br>dlg := TBrowseForFolderDialog.Create; <br>dlg.Title := '请选取目标文件夹:'; <br>if dlg.Execute then <br>begin <br>DestPath := dlg.Path; <br>end; <br>dlg.Free; <br>end; <br><br>4.开始切割 <br>根据上边步骤的选择,确定了待切割的原始文件,切割大小和存放位置,下边就可以开始了。 <br>首先我们用一个“文件流”以只读方式打开原始文件 <br>var <br>fs:TFileStream; <br>begin <br>fs:=TfileStream.create(“文件名称”,fmOpenRead) <br>…………… <br><br>然后我们创建一个“内存流” <br>var <br>ms:TmemoryStream; <br>begin <br>ms:=TmemoryStream.create; <br>…………… <br>根据文件切割的大小计算字节数,从“文件流”中向“内存流”中拷贝指定的大小,将内存流存储到目标文件夹下,文件扩展名累计创建(方便合并) <br><br>分析切割大小: <br>case rdgCut.ItemIndex of <br>0: filesize := 2000 * 1024; //2000 K <br>1: filesize := 1440 * 1024; //1440 K <br>2: filesize := 1200 * 1024; //1200 K <br>3: filesize := 1000 * 1024; //1000 K <br>4: filesize := 720 * 1024; //720 K <br>5: filesize := 500 * 1024; //500 K <br>6: filesize := 300 * 1024; //300 K <br>7: filesize := 200 * 1024; //200 K <br>else filesize := 100 * 1024; //100 K <br><br><br>在切割过程中应该显示一个进度,让用户了解进度,放置一个ProgressBar控件到主窗体中,设置属性。在切割开始时根据文件大小设定最大最小值和步长,在切割过程中不断根据实际情况修改当前位置,给用户一个运动的状态。代码如下所示: <br><br>过程化显示切割进程 <br><br>fs := TFileStream.Create(filename, fmopenread); <br>ms := TMemoryStream.Create; <br>FileCount := 1; <br><br>prbCut.Min := 0; <br>prbCut.Max := (fs.size div filesize) + 1; <br>prbCut.step := 1; <br><br>while fs.Position < fs.Size - 1 do <br>begin <br>ms.position := 0; <br>ms.size := 0; <br><br>if fs.size - fs.Position < FileSize <br>then FileSize := fs.size - fs.position; <br><br>ms.CopyFrom(fs, FileSize); <br>application.ProcessMessages; <br><br>prbCut.StepIt; <br>ms.SaveToFile(DestPath + '/' + extractfilename(filename) + '.' + inttostr(FileCount)); <br>memCut.lines.add('正在生成第 ' + inttostr(FileCount) + ' 个文件!'); <br>inc(FileCount); <br><br>end; <br><br><br>5.创建自动合并文件的批处理命令 <br><br>在 Dos 中有一条命令可以完成文件的合并 <br>Copy file1 /b +file2 /b file3 <br><br>我们只要生成一个批处理命令文件,就可以在需要的时候完成合并工作,代码如下所示: <br><br>assignfile(bat, DestPath + '/' + changefileext(ExtractFileName(filename), '.bat')); <br>rewrite(bat); <br>writeln(bat, 'echo off'); <br>writeln(bat,'echo 谢谢使用文件分割 XCut 1.0 .....'); <br>writeln(bat, 'echo .'); <br>writeln(bat,'echo 正在准备生成文件'+extractfilename(filename)); <br>writeln(bat, 'echo .'); <br>writeln(bat,' echo 您可以按 CTRL + Z 键 中止,其他键继续!'); <br><br>writeln(bat,'pause'); <br><br><br>for i := 1 to FileCount + 1 do <br>begin <br>if i = 1 <br>then writeln(bat, 'copy ' + extractfilename(FileName) + '.1/b ' + extractfilename(FileName)) <br>else writeln(bat, 'copy ' + extractfilename(FileName) + '/b +' + extractfilename(FileName) + '.' + inttostr(i) + '/b'); <br><br>end; <br><br><br>memCut.lines.add('正在生成合并命令文件: ' + changefileext(extractfilename(FileName), '.bat')); <br><br>closefile(bat); <br><br>memCut.lines.add('切割成功完成!'); <br>Application.MessageBox('切割成功完成!', '恭喜', MB_OK + MB_ICONINFORMATION); <br><br>6.运行结果显示 <br><br><br><br><br>本程序在Windows 98 、Windows NT 4.0 和Delphi 4.0 环境调试通过<br><br> <br>摘自:计算机世界网 <br> <br> <br> <br>