一問題的提出
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下調試通過
From:http://tw.wingwit.com/Article/program/Delphi/201311/8413.html