一问题的提出
Winzip是电脑使用过程中备份和数据交换的常用工具之一然而在实际使用过程中笔者发现Winzip在用来进行数据交换操作时有一些不尽人意的地方 如
当将一个大的压缩包分卷压缩到软盘上时操作者手头必须有多张软盘才能完成数据包的转存这种情况如果发生在手头只有一张软盘的情况下可真的没办法
如果分卷存储数据软盘中的某张软盘在写入或读出数据时发生错误则上一过程必须重做
要在其它机器上读出软盘上的数据则该机器也必须要求安装了Winzip
那么有没有好的解决办法避免上述容易出错和烦琐安装软件的过程呢?因此笔者用Delphi编制了压缩助理程序以为数据交换提供一种辅助方法和手段
二压缩助理程序设计的基本思路
通过压缩工具将要在不同计算机间交换的文件压缩并转换成自解压格式通过压缩助理程序将该自解压包以软盘容量为单位分割成多个存储在硬盘上的文件这样通过Copy命令和一张软盘就能够实现对大的压缩包在不通的计算机间交换数据再利用压缩助理程序在另一台机器上将上述多个文件合并成为自解压文件格式避免了再安装Winzip软件的繁琐过程通过压缩助理程序上述问题即可迎刃而解
三实现方法
. 程序设计界面
. 控件属性设置
Form的BorderStyle=bsDialog
两个OpenDialog控件名称分别设置为OpenDlg OpenDlg
设置OpenDlg的Options属性中的ofAllowMultiSelect=True
Filter属性设置为Split File(*spt)|*spt|All File(**)|**
SaveDialog的名称为SaveDlgSpinEdit的Value=MinValue=
MaxValue= Increment=在合并按钮左边的控件是ListBox
名称ListBoxListBox的Sorted=True其它控件一个TImage控件
个Tedit和个Tbutton其属性从略
. 压缩助理程序的实现
从上到下五个命令按钮的代码依次如下
//选择待分割的文件
procedure TFormButtonClick(Sender: TObject);
begin
if OpenDlgExecute then
begin
EditText := OpenDlgFileName;
end;
end;
//设置分割后的切片文件的存储位置
//SelectDirectory函数声明在FileCtrl单元中
procedure TFormButtonClick(Sender: TObject);
var
Dir: string;
begin
if SelectDirectory(选择存储目录: Dir) then
begin
EditText := Dir + \;
end;
end;
//分割文件为切片文件自动命名
procedure TFormButtonClick(Sender: TObject);
var
I K Rest Len: Integer;
AF BF: TFileStream; //文件流对象
Fn: string; //文件名
Buf : Integer; //单碟容量
begin
if (EditText = ) or (EditText = ) then
begin
Beep;
Exit;
end;
//单蝶容量计算为字节数
buf := SpinEditValue * ;
I := ;
try
Af := TFileStreamCreate(EditText fmOpenRead);
K := AfSize div Buf;
Rest := AfSize K * Buf;
For I := to K do
begin
Fn := EditText + IntToStr(I) + spt; //文件名
Bf := TFileStreamCreate(Fn fmCreate);
BfCopyFrom(Af Buf);
BfFree;
end;
if Rest > then
begin
Fn := EditText + IntToStr(I) + spt;
Bf := TFileStreamCreate(Fn fmCreate);
BfCopyFrom(Af Rest);
BfFree;
end;
finally
AFFree;
end;
end;
//将分割后的切片文件装入到ListBox中
procedure TFormButtonClick(Sender: TObject);
var
I : Integer;
begin
if OpenDlgExecute then
For I := to OpenDlgFilesCount do
ListBoxItemsAdd(OpenDlgfiles[I]);
end;
//合并切片文件并保存合并结果
procedure TFormButtonClick(Sender: TObject);
var
Af Bf: TFileStream; //文件流对象
Fn Ft: string; //文件名
I : Integer;
begin
if ListBoxItemsCount = then
begin
Beep;
Exit;
end;
if SaveDlgExecute then
begin
Fn := SaveDlgFileName;
try
Af := TFileStreamCreate(Fn fmCreate);
For I := to ListBoxItemsCount do
begin
Ft := ListBoxItems[I];
Bf := TFileStreamCreate(Ft fmOpenRead);
AfCopyFrom(Bf BfSize);
BfFree;
end;
finally
AfFree;
end;
end;
end;
上述代码在WindowsDelphi下调试通过