[Delphi]制作简单的压缩软件

      编程资料 2004-12-19 22:22
制作简单的压缩软件

现在流行的压缩软件有Winzip和Winrar,它们都有着非常强大的功能,压缩与解压缩都采用多种算法来完成,它们的压缩比是相当大的,所以就被广泛应用起来了。但大家又知道不知道它是怎样完成压缩和解压缩的呢?现在就向大家介绍一种制作单文件的压缩与解压软件。它是采用流技术来进行数据的压缩与解压的。现将实现过程介绍如下:
1.软件界面布局
新建一项目,在Form1中添加6个Button控件、4个Edit控件、1个OpenDialog和1个SaveDialog控件。当添加完以上控件后,接下来就是设置它们的属性,设置6个Button的Caption属性分别为“压缩”、“解压”、“打开待压缩的文件”、“保存压缩后的文件”、“打开待解压的文件”和“保存解压后的文件”。其窗口的布局如图所示。
<1.tif>
2.程序的实现
首先我们来自定义两个过程,分别为压缩文件过程(CompressFile)和解压文件过程(DecompressFile),由于在本程序实现过程中需要用到两个重要的类,它们分别是TCompressionStream和TDecompressionStream,所以务必在Uses部分加入zlib单元。此两个过程的程序代码如下:
//压缩文件过程
procedure CompressFile(Source, Target: String);
const
COMPRESS_ERROR = '压缩文件时出现内部错误:';
Buff = $4096;
var
i: Integer;
Buf: array[0..Buff] of byte;
ComStream: TCompressionStream;
InStream, OutStream: TFileStream;
begin
InStream := Nil;
OutStream := nil;
ComStream := nil;
try
// 生成流
InStream := TFileStream.Create(Source, fmOpenRead OR fmShareDenyNone );
OutStream := TFileStream.Create(Target, fmCreate OR fmShareDenyWrite );
ComStream := TCompressionStream.Create(clMax, OutStream);
// 解压流
for i := 1 to (InStream.Size div Buff) do begin
InStream.ReadBuffer(Buf, Buff);
ComStream.Write(Buf, Buff);
end;
i := InStream.Size mod Buff;
if (i > 0) then begin
InStream.ReadBuffer(Buf, i);
ComStream.Write(Buf, i);
End;
// 要按先后关闭流
ComStream.Free;
ComStream := nil;
OutStream.Free;
OutStream := nil;
InStream.Free;
InStream := nil;
except
on n: Exception do begin
if (InStream <> nil) then
InStream.Free;
if (OutStream <> nil) then
OutStream.Free;
if (ComStream <> nil) then
ComStream.Free;
MessageDlg(COMPRESS_ERROR + #13 + n.Message, mtError,[mbOk], 0);
end;
end;
end;
//压缩文件过程
procedure DecompressFile(Source, Target: String);
const
DECOMPRESS_ERROR = '解压文件时出现内部错误:';
Buff = $4096;
var
i: Integer;
Buf: array[0..Buff] of Byte;
DecomStream: TDecompressionStream;
InStream, OutStream: TFileStream;
begin
InStream := nil;
OutStream := nil;
DecomStream := nil;
try
// 生成流
InStream := TFileStream.Create(Source, fmOpenRead or fmShareDenyNone);
OutStream := TFileStream.Create(Target, fmCreate or fmShareDenyWrite);
DecomStream := TDeCompressionStream.Create(InStream);
// 解压流
repeat
i := DecomStream.Read(Buf, Buff);
OutStream.WriteBuffer(Buf, i);
until(i = 0);
// 按先后关闭流
DecomStream.Free;
DecomStream := nil;
OutStream.Free;
OutStream := nil;
InStream.Free;
InStream := nil;
except
on n: Exception do begin
if (InStream <> nil) then
InStream.Free;
if (OutStream <> nil) then
OutStream.Free;
if (DecomStream <> nil) then
DecomStream.Free;
MessageDlg(DECOMPRESS_ERROR + #13 + n.Message, mtError, [mbOk], 0);
end;
end;
end;
成功定义了以上两个过程之后,接下来就是完成一些文件的打开与保存路径的程序代码了。它们的实现代码如下:
//打开待压缩的文件
procedure TForm1.Button3Click(Sender: TObject);
begin
if form1.OpenDialog1.Execute then
form1.Edit1.Text:=form1.OpenDialog1.FileName;
end;
//保存压缩后的文件
procedure TForm1.Button4Click(Sender: TObject);
begin
if form1.SaveDialog1.Execute then
form1.Edit2.Text:=form1.SaveDialog1.FileName;
end;
//打开待解压的文件
procedure TForm1.Button5Click(Sender: TObject);
begin
if form1.OpenDialog1.Execute then
form1.Edit3.Text:=form1.OpenDialog1.FileName;
end;
//保存解压后的文件
procedure TForm1.Button6Click(Sender: TObject);
begin
if form1.SaveDialog1.Execute then
form1.Edit4.Text:=form1.SaveDialog1.FileName;
end;
//压缩
procedure TForm1.Button1Click(Sender: TObject);
begin
CompressFile(Edit1.Text, Edit2.Text);//调用CompressFile过程
end;
//解压缩
procedure TForm1.Button2Click(Sender: TObject);
begin
DecompressFile(Edit3.Text, Edit4.Text);//调用DecompressFile过程
end;
好了,一个简单的单文件压缩与解压缩软件已经制作完成了。
本程序在Win98+Delphi6运行通过。
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}