一、問題的提出 Winzip是電腦使用過程中,備份和數據交換的常用工具之一。然而,在實際使用過程中,筆者發現Winzip在用來進行數據交換操作時有一些不盡人意的地方, 如: 1. 當將一個大的壓縮包分卷壓縮到軟盤上時,操作者手頭必須有多張軟盤才能完成數據包的轉存,這種情況如果發生在手頭只有一張軟盤的情況下,可真的沒辦法。 2. 如果分卷存儲數據軟盤中的某張軟盤在寫入或讀出數據時發生錯誤,則上一過程必須重做 3. 要在其它機器上讀出軟盤上的數據,則該機器也必須要求安裝了Winzip。 那么,有沒有好的解決辦法,避免上述容易出錯和煩瑣安裝軟件的過程呢?因此,筆者用Delphi5.0編制了壓縮助理程序,以為數據交換提供一種輔助方法和手段。
二、壓縮助理程序設計的基本思路 通過壓縮工具將要在不同計算機間交換的文件壓縮并轉換成自解壓格式,通過壓縮助理程序將該自解壓包以軟盤容量為單位分割成多個存儲在硬盤上的文件,這樣,通過Copy命令和一張軟盤就能夠實現對大的壓縮包在不通的計算機間交換數據;再利用壓縮助理程序在另一臺機器上將上述多個文件合并,成為自解壓文件格式,避免了再安裝Winzip軟件的繁瑣過程。通過壓縮助理程序,上述問題即可迎刃而解。
三、實現方法 1. 程序設計界面
2. 控件屬性設置 Form1的BorderStyle=bsDialog;兩個OpenDialog控件名稱分別設置為OpenDlg, OpenDlg1;設置OpenDlg1的Options屬性中的ofAllowMultiSelect=True,Filter屬性設置為Split File(*.spt)|*.spt|All File(*.*)|*.*;SaveDialog的名稱為SaveDlg;SpinEdit1的Value=1440,MinValue=1440,MaxValue=1600, Increment=1;在“合并”按鈕左邊的控件是ListBox,名稱ListBox1,ListBox1的Sorted=True;其它控件:一個TImage控件,2個Tedit和5個Tbutton,其屬性從略。 3. 壓縮助理程序的實現 從上到下五個命令按鈕的代碼依次如下: //選擇待分割的文件 procedure TForm1.Button1Click(Sender: TObject); begin if OpenDlg.Execute then begin Edit1.Text := OpenDlg.FileName; end; end;
//設置分割后的切片文件的存儲位置 //SelectDirectory函數聲明在FileCtrl單元中 procedure TForm1.Button2Click(Sender: TObject); var Dir: string; begin if SelectDirectory('選擇存儲目錄:', '', Dir) then begin Edit2.Text := Dir + '\'; end; end;
//分割文件為切片文件,自動命名 procedure TForm1.Button3Click(Sender: TObject); var I, K, Rest, Len: Integer; AF, BF: TFileStream; //文件流對象 Fn: string; //文件名 Buf : Integer; //單碟容量 begin if (Edit1.Text = '') or (Edit2.Text = '') then begin Beep; Exit; end; //單蝶容量計算為字節數 buf := SpinEdit1.Value * 1024; I := 1; try Af := TFileStream.Create(Edit1.Text, fmOpenRead); K := Af.Size div Buf; Rest := Af.Size - K * Buf; For I := 1 to K do begin Fn := Edit2.Text + IntToStr(I) + '.spt'; //文件名 Bf := TFileStream.Create(Fn, fmCreate); Bf.CopyFrom(Af, Buf); Bf.Free; end; if Rest > 0 then begin Fn := Edit2.Text + IntToStr(I) + '.spt'; Bf := TFileStream.Create(Fn, fmCreate); Bf.CopyFrom(Af, Rest); Bf.Free; end; finally AF.Free; end; end;
//將分割后的切片文件裝入到ListBox1中 procedure TForm1.Button4Click(Sender: TObject); var I : Integer; begin if OpenDlg1.Execute then For I := 0 to OpenDlg1.Files.Count - 1 do ListBox1.Items.Add(OpenDlg1.files[I]); end;
//合并切片文件并保存合并結果 procedure TForm1.Button5Click(Sender: TObject); var Af, Bf: TFileStream; //文件流對象 Fn, Ft: string; //文件名 I : Integer; begin if ListBox1.Items.Count = 0 then begin Beep; Exit; end; if SaveDlg.Execute then begin Fn := SaveDlg.FileName; try Af := TFileStream.Create(Fn, fmCreate); For I := 0 to ListBox1.Items.Count -1 do begin Ft := ListBox1.Items[I]; Bf := TFileStream.Create(Ft, fmOpenRead); Af.CopyFrom(Bf, Bf.Size); Bf.Free; end; finally Af.Free; end; end; end; 上述代碼在Windows98,Delphi5.0下調試通過。
|