📄 unit1.~pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Gauges, StdCtrls, Buttons, ZLib, FileCtrl, StrUtils;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
EditZipSource: TEdit;
Label2: TLabel;
EditZipSave: TEdit;
BtnZipSource: TSpeedButton;
btnZipSave: TSpeedButton;
btnZip: TButton;
PsZip: TGauge;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
btnUnZipSource: TSpeedButton;
btnUnZipSave: TSpeedButton;
PsUnZip: TGauge;
EditUnZipSource: TEdit;
EditUnZipSave: TEdit;
btnUnZip: TButton;
openZip: TOpenDialog;
openUnZip: TOpenDialog;
procedure BtnZipSourceClick(Sender: TObject);
procedure btnUnZipSourceClick(Sender: TObject);
procedure btnZipSaveClick(Sender: TObject);
procedure btnUnZipSaveClick(Sender: TObject);
procedure btnZipClick(Sender: TObject);
procedure btnUnZipClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnProgressZip(Sender: TObject);
end;
var
Form1: TForm1;
FCompressStream : TCompressionStream; //压缩流
FDecompressStream : TDecompressionStream; //解压流
FMemoryStream : TMemoryStream; //源内存流
FZipMemoryStream : TMemoryStream; //目标内存流
FSourceFileName : String; //压缩源文件名
FZipFileName : string; //压缩文件名
FUnZipFileName : string; //解压文件名
i: integer = 0;
implementation
{$R *.dfm}
procedure TForm1.BtnZipSourceClick(Sender: TObject);
begin
if openZip.Execute then
begin
EditZipSource.Text := openZip.FileName;
FSourceFileName := ExtractFileName(openZip.FileName);
FZipFileName := FSourceFileName+'.ZMP';
end;
end;
procedure TForm1.btnUnZipSourceClick(Sender: TObject);
begin
if openUnZip.Execute then
EditUnZipSource.Text := openUnZip.FileName;
end;
procedure TForm1.btnZipSaveClick(Sender: TObject);
var
s: string;
begin
if SelectDirectory('选择压缩文件保存路径','',s) then
EditZipSave.Text := s;
end;
procedure TForm1.btnUnZipSaveClick(Sender: TObject);
var
s: string;
begin
if SelectDirectory('选择解压文件保存路径','',s) then
begin
if Trim(EditUnZipSource.Text) = '' then
exit;
FUnZipFileName := AnsiReplaceText(ExtractFileName(EditUnZipSource.Text),'.ZMP','');
EditUnZipSave.Text := s;
end;
end;
procedure TForm1.btnZipClick(Sender: TObject);
var
Size,x: integer;
Time1,Time2,TheTime: double;
begin
if (Trim(EditZipSource.Text) = '') or (Trim(EditZipSave.Text) = '') then
exit;
i := 0;
FMemoryStream := TMemoryStream.Create;
FZipMemoryStream := TMemoryStream.Create;
try
FMemoryStream.LoadFromFile(EditZipSource.Text);
Size := FMemoryStream.Size;
x := FZipMemoryStream.Write(size,sizeof(size)); //写入原始文件大小
FCompressStream := TCompressionStream.Create(clDefault,FZipMemoryStream);
try
Time1 := GetTickCount;
PsZip.Progress := 0;
PsZip.MaxValue := size; //此处不对
FCompressStream.OnProgress := OnProgressZip;
FMemoryStream.SaveToStream(FCompressStream);
finally
FCompressStream.Free; //Free以后才算压缩成功,所以要先Free,再保存到文件
Time2 := GetTickCount;
end;
FZipMemoryStream.SaveToFile(EditZipSave.Text+FZipFileName);
ShowMessage(IntToStr(i)+#13#10+FloatToStr((Time2-Time1)/i)+#13#10+IntToStr(x));
finally
FMemoryStream.Free;
FZipMemoryStream.Free;
end;
end;
procedure TForm1.btnUnZipClick(Sender: TObject);
var
Size: integer;
begin
if (Trim(EditUnZipSource.Text) = '') or (Trim(EditUnZipSave.Text) = '') then
exit;
FMemoryStream := TMemoryStream.Create;
FZipMemoryStream := TMemoryStream.Create;
try
FZipMemoryStream.LoadFromFile(EditUnZipSource.Text);
FZipMemoryStream.Position := 0; //复位指针
FZipMemoryStream.ReadBuffer(Size,sizeof(Size)); //读出文件压缩前的大小
FMemoryStream.SetSize(Size); //设置需要的大小
FDecompressStream := TDecompressionStream.Create(FZipMemoryStream);
try
FDecompressStream.Read(FMemoryStream.Memory^,Size);
finally
FDecompressStream.Free;
end;
FMemoryStream.SaveToFile(EditUnZipSave.Text+FUnZipFileName);
ShowMessage('OK');
finally
FMemoryStream.Free;
FZipMemoryStream.Free;
end;
end;
procedure TForm1.OnProgressZip(Sender: TObject);
begin
PsZip.Progress := PsZip.Progress + 1;
i := i + 1;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -