⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit2.pas

📁 文件解压缩,大家学习一下
💻 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 + -