📄 unit2.pas
字号:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,FileCtrl;
type
TFileVer=record
Ver1:Integer;
Ver2:Integer;
Ver3:Integer;
Ver4:Integer;
VerStr:String[4];
end;
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
SaveDialog2: TSaveDialog;
OpenDialog2: TOpenDialog;
Memo1: TMemo;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
FileVer:TFileVer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses UnitCompr;
{$R *.DFM}
function SlashSep(const sPath, S: String): String;
begin
if sPath='' then
begin
Result:='\';
Exit;
end;
if (AnsiLastChar(sPath)^ <> '\') and (Copy(s,1,1)<>'\') then
Result := sPath + '\' + S
else if (AnsiLastChar(sPath)^ = '\') and (Copy(s,1,1)='\') then
Result:=sPath+Trim(Copy(s,2,length(s)))
else
Result := sPath + S;
end;
procedure TForm2.Button1Click(Sender: TObject);
Var MemStr,MemStr1,MemStr2:TMemoryStream;
FileName:String;
FileNameSize,DataSize:LongInt;
i:Integer;
begin
MemStr:=TMemoryStream.Create;
MemStr1:=TMemoryStream.Create;
MemStr2:=TMemoryStream.Create;
try
MemStr.Clear;
MemStr1.Clear;
MemStr2.Clear;
with TCompressCtrl.Create(nil) do
begin
try
if OpenDialog1.Execute then
begin
FileVer.Ver1:=1;
FileVer.Ver2:=0;
FileVer.Ver3:=0;
FileVer.Ver4:=0;
FileVer.VerStr:='Aizb';
MemStr2.WriteBuffer(FileVer,sizeof(TFileVer)); //写入文件版本号。
For i:=0 to OpenDialog1.Files.Count-1 do
begin
MemStr1.Clear;
MemStr.Clear;
MemStr.LoadFromFile(OpenDialog1.Files[i]); //装入第i个文件。
Backup(MemStr,MemStr1); //压缩第i个文件。
FileName:=OpenDialog1.Files[i];
FileNameSize:=Length(FileName);
MemStr2.WriteBuffer(FileNameSize,sizeof(LongInt)); //写入第i个文件名长度。
MemStr2.WriteBuffer(PChar(FileName)^,FileNameSize); //写入第i个文件名。
DataSize:=MemStr1.Size;
MemStr2.WriteBuffer(DataSize,sizeof(LongInt)); //写入第i个文件压缩后的数据长度。
MemStr2.CopyFrom(MemStr1,MemStr1.Size); //写入第i个文件压缩后的数据。
end;
FileNameSize:=-1;
MemStr2.WriteBuffer(FileNameSize,sizeof(LongInt)); //写入一个-1。
if SaveDialog1.Execute then
MemStr2.SaveToFile(SaveDialog1.FileName);
end;
finally
Free;
end;
end;
finally
MemStr.Free;
MemStr1.Free;
MemStr2.Free;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.Button2Click(Sender: TObject);
Var MemStr,MemStr1,MemStr2:TMemoryStream;
FileNameSize,DataSize,StreamSize:LongInt;
FileName:String;
Dir:String;
bHasSelectDir:Boolean;
begin
MemStr:=TMemoryStream.Create;
MemStr1:=TMemoryStream.Create;
MemStr2:=TMemoryStream.Create;
try
MemStr.Clear;
MemStr1.Clear;
MemStr2.Clear;
bHasSelectDir:=False;
with TCompressCtrl.Create(nil) do
begin
try
if OpenDialog2.Execute then
begin
MemStr1.LoadFromFile(OpenDialog2.FileName);
MemStr1.Seek(0,0);
StreamSize:=MemStr1.Size;
MemStr1.ReadBuffer(FileVer,sizeof(TFileVer)); //读出文件版本。
inc(StreamSize,-sizeof(TFileVer));
if
(FileVer.Ver1=1)
and (FileVer.Ver2=0)
and (FileVer.Ver3=0)
and (FileVer.Ver4=0)
and (FileVer.VerStr='Aizb') then
begin
FileNameSize:=0;
While StreamSize>0 do
begin
MemStr1.ReadBuffer(FileNameSize,SizeOf(LongInt)); //读出一个文件名的长度。
inc(StreamSize,-sizeof(LongInt));
if StreamSize<=0 then
Break;
if FileNameSize=-1 then
Break;
SetString(FileName, PChar(nil), FileNameSize); //设置字符串长度。
MemStr1.ReadBuffer(PChar(FileName)^,FileNameSize); //读出文件名。
inc(StreamSize,-FileNameSize);
if StreamSize<=0 then
Break;
MemStr1.ReadBuffer(DataSize,SizeOf(LongInt)); //读出数据长度。
inc(StreamSize,-SizeOf(LongInt));
if StreamSize<=0 then
Break;
if not bHasSelectDir then
begin
Dir:=ExtractFilePath(FileName);
if SelectDirectory(Dir,[],0) then
bHasSelectDir:=True
else
Break;
end;
MemStr2.Clear;
MemStr2.CopyFrom(MemStr1,DataSize); //读出压缩数据。
Restore(MemStr2,MemStr); //解压缩数据。
MemStr.SaveToFile(SlashSep(Dir,ExtractFileName(FileName))); //保存。
inc(StreamSize,-DataSize);
if StreamSize<=0 then
Break;
end;
end else
ShowMessage('Not a AZB File!');
end;
finally
Free;
end;
end;
finally
MemStr.Free;
MemStr1.Free;
MemStr2.Free;
end;
end;
procedure TForm2.Button4Click(Sender: TObject);
Var MemStr,MemStr1,MemStr2:TMemoryStream;
FileNameSize,DataSize,StreamSize:LongInt;
FileName:String;
begin
Memo1.Clear;
MemStr:=TMemoryStream.Create;
MemStr1:=TMemoryStream.Create;
MemStr2:=TMemoryStream.Create;
try
MemStr.Clear;
MemStr1.Clear;
MemStr2.Clear;
with TCompressCtrl.Create(nil) do
begin
try
if OpenDialog2.Execute then
begin
MemStr1.LoadFromFile(OpenDialog2.FileName);
MemStr1.Seek(0,0);
StreamSize:=MemStr1.Size;
MemStr1.ReadBuffer(FileVer,sizeof(TFileVer)); //读出文件版本。
inc(StreamSize,-sizeof(TFileVer));
if
(FileVer.Ver1=1)
and (FileVer.Ver2=0)
and (FileVer.Ver3=0)
and (FileVer.Ver4=0)
and (FileVer.VerStr='Aizb') then
begin
FileNameSize:=0;
While StreamSize>0 do
begin
MemStr1.ReadBuffer(FileNameSize,SizeOf(LongInt)); //读出一个文件名的长度。
inc(StreamSize,-sizeof(LongInt));
if StreamSize<=0 then
Break;
if FileNameSize=-1 then
Break;
SetString(FileName, PChar(nil), FileNameSize); //设置字符串长度。
MemStr1.ReadBuffer(PChar(FileName)^,FileNameSize); //读出文件名。
Memo1.Lines.Add(FileName);
inc(StreamSize,-FileNameSize);
if StreamSize<=0 then
Break;
MemStr1.ReadBuffer(DataSize,SizeOf(LongInt)); //读出数据长度。
inc(StreamSize,-SizeOf(LongInt));
if StreamSize<=0 then
Break;
MemStr1.Seek(DataSize,soFromCurrent);
inc(StreamSize,-DataSize);
if StreamSize<=0 then
Break;
end;
end else
ShowMessage('Not a AZB File!');
end;
finally
Free;
end;
end;
finally
MemStr.Free;
MemStr1.Free;
MemStr2.Free;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -