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

📄 unit1.pas

📁 有解压密码的要说明密码,只对文本文件有效
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, shlobj,INIFILES,zlib,Registry, StdCtrls, ComCtrls, Buttons;

type
  pass=string[20];
  Tmyzip = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    TrackBar1: TTrackBar;
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
  procedure regzzz;

  procedure ys_file(infileName, outfileName: string;password:pass;isjm:boolean;ysbz:integer);

  function jy_file(infileName: string;password:pass=''):boolean;

  procedure zjywj(var filename:string);

  constructor Create(Aowner: TComponent);
//  constructor Create;

  destructor Destroy; override;

    { Public declarations }
  end;

var
  myzip: Tmyzip;

implementation

{$R *.dfm}
{$R jm.Res}


constructor Tmyzip.Create(Aowner: TComponent);
//constructor Tmyzip.Create;

begin

inherited Create(Aowner); // 初始化继承下来的部分

end;

//#####################################################

//原文件加密

procedure jm_File(vFile:string;var Target:TMemoryStream;password:pass;isjm:boolean);

{

vfile:加密文件

target:加密后输出目标流》》》

password:密码

isjm:是否加密

-------------------------------------------------------------

加密后文件SIZE=原文件SIZE+[INI加密压缩信息文件]的SIZE+存储[INI加密压缩信息文件]的大小数据类型的SIZE

---------------------------------------------------------------

}

var

 

tmpstream,inistream:TFileStream;

FileSize:integer;

inifile:TINIFILE;

filename:string;

begin

//打开需要 [加密压缩文件]

tmpstream:=TFileStream.Create(vFile,fmOpenread or fmShareExclusive);

try

//向 [临时加密压缩文件流] 尾部写入 [原文件流]

Target.Seek(0,soFromEnd);

Target.CopyFrom(tmpstream,0);

//取得文件路径,生成 [INI加密压缩信息文件]

filename:=ExtractFilePath(paramstr(0))+'tmp.in_';

inifile:=TInifile.Create(filename);

inifile.WriteString('file1','filename',ExtractFileName(vFile));

inifile.WriteString('file1','password',password);

inifile.WriteInteger('file1','filesize',Target.Size);

inifile.WriteDateTime('file1','fileDate',now());

inifile.WriteBool('file1','isjm',isjm);

inifile.Free ;

//读入 [INI加密压缩信息文件流]

inistream:=TFileStream.Create(filename,fmOpenread or fmShareExclusive);

  try

  //继续在 [临时加密压缩文件流] 尾部加入 [INI加密压缩信息文件]

  inistream.Position :=0;

  Target.Seek(0,sofromend);

  Target.CopyFrom(inistream,0);

  //计算当前 [INI加密压缩信息文件] 的大小

  FileSize:=inistream.Size ;

  //继续在 [临时加密文件尾部] 加入 [INI加密压缩信息文件] 的SIZE信息

  Target.WriteBuffer(FileSize,sizeof(FileSize));

  finally

  inistream.Free ;

  deletefile(filename);

  end;

finally

tmpstream.Free;

end;

 

 

end;

 

//**************************************************************

 

//流压缩

procedure ys_stream(instream, outStream: TStream;ysbz:integer);

{

instream: 待压缩的已加密文件流

outStream  压缩后输出文件流

ysbz:压缩标准

}

var

  ys: TCompressionStream;

begin

  //流指针指向头部

  inStream.Position := 0;

  //压缩标准的选择

  case ysbz of

  1:  ys := TCompressionStream.Create(clnone,OutStream);//不压缩

  2:  ys := TCompressionStream.Create(clFastest,OutStream);//快速压缩

  3:  ys := TCompressionStream.Create(cldefault,OutStream);//标准压缩

  4:  ys := TCompressionStream.Create(clmax,OutStream); //最大压缩

  else



  ys := TCompressionStream.Create(clFastest,OutStream);

  end;

 

  try

    //压缩流

    ys.CopyFrom(inStream, 0);

  finally

    ys.Free;

  end;

end;

 

//*****************************************************************

 

 

//流解压

procedure jy_Stream(instream, outStream: TStream);

{

instream :原压缩流文件

outStream:解压后流文件

}

var

  jyl: TDeCompressionStream;

  buf: array[1..512] of byte;

  sjread: integer;

begin

  inStream.Position := 0;

  jyl := TDeCompressionStream.Create(inStream);

  try

    repeat

      //读入实际大小

      sjRead := jyl.Read(buf, sizeof(buf));

      if sjread > 0 then

        OutStream.Write(buf, sjRead);

    until (sjRead = 0);

  finally

    jyl.Free;

  end;

end;

 

 

//**************************************************************

 

//实现关联注册

procedure Tmyzip.regzzz;

var

reg: TRegistry;

begin

  reg := TRegistry.Create;

  reg.RootKey := HKEY_CLASSES_ROOT;

  reg.OpenKey('.zzz', true);

  reg.WriteString('', 'myzip');

  reg.CloseKey;

  reg.OpenKey('myzip\shell\open\command', true);

  //用于打开.zzz文件的可执行程序

  reg.WriteString('', '"' + application.ExeName + '" "%1"');

  reg.CloseKey;

  reg.OpenKey('myzip\DefaultIcon',true);

  //取当前可执行程序的图标为.zzz文件的图标

  reg.WriteString('',''+application.ExeName+',0');

  reg.Free;

  //立即刷新

  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);

 

end;

 

//压缩文件

procedure Tmyzip.ys_file(infileName, outfileName: string;password:pass;isjm:boolean;ysbz:integer);

{

infileName://需要压缩加密的文件

outfileName://压缩加密后产生的文件

password://解压密码

ysbz://压缩标准

}

var

instream:TMemoryStream;   //文件加密后的临时流

outStream: TFileStream;   //压缩输出文件流

 

begin

    //创建 [文件加密后的临时流]

    instream:=TMemoryStream.Create;

    //文件加密

    jm_file(infileName,instream,password,isjm);

    //创建压缩输出文件流

    outStream := TFileStream.create(outFIleName, fmCreate);

    try

     //[文件加密后的临时流] 压缩

     ys_stream(instream,OutStream,ysbz);

    finally

      OutStream.free;

      instream.Free ;

    end;

end;

 

//解压文件

function Tmyzip.jy_file(infileName: string;password:pass=''):boolean;

var

  inStream,inistream,filestream_ok: TFileStream;

{

instream://解压文件名称

inistream://INI临时文件流

filestream_ok://解压OK的文件

}

  outStream:tmemorystream;  //临时内存流

  inifile:TINIFILE; //临时INI文件

  FileSize:integer;  //密码文件的SIZE

  resultvalue:boolean;//返回值

 

begin

 

try

  inStream := TFileStream.create(inFIleName, fmOpenRead);

 

  try

    outStream := tmemorystream.create;

    try

      jy_stream(insTream,OutStream);

      //生成临时INI文件

         inistream:=TFileStream.create(ExtractFilePath(paramstr(0))+'tmp.in_', fmCreate);

         try

            //指向存储解码信息的INTEGER型变量位置

            OutStream.Seek(-sizeof(FileSize),sofromend);

            //读入变量信息

            OutStream.ReadBuffer(FileSize,sizeof(FileSize));

            //指向解码信息位置

            OutStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);

            //将解码信息读入INI流中

            inistream.CopyFrom(OutStream,FileSize);

            //释放INI文件流

            inistream.Free ;

            //读入INI文件信息

            inifile:=TINIFILE.Create(ExtractFilePath(paramstr(0))+'tmp.in_');

            resultvalue:=inifile.ReadBool('file1','isjm',false);

            if resultvalue then

            begin

               if inifile.ReadString ('file1','password','')=trim(password) then

               resultvalue:=true

               else

               resultvalue:=false;

            end

            else

            resultvalue:=true;

 

            if resultvalue then

            begin

 

               filestream_ok:=TFileStream.create(ExtractFilePath(paramstr(1))+inifile.ReadString('file1','filename','wnhoo.zzz'),fmCreate);

               try

               OutStream.Position :=0;

               filestream_ok.CopyFrom(OutStream,inifile.ReadInteger('file1','filesize',0));

               finally

               filestream_ok.Free ;

              end;

 

            end;

 

 

           inifile.Free;

         finally

          //删除临时INI文件

         deletefile(ExtractFilePath(paramstr(0))+'tmp.in_');

         end;

      //

    finally

      OutStream.free;

    end;

  finally

    inStream.free;

  end;

except

resultvalue:=false  ;

 

end;

result:=resultvalue;

end;

 

 

 

//自解压创建

procedure tmyzip.zjywj(var filename:string);

var

myRes: TResourceStream;//临时存放自解压EXE文件

myfile:tfilestream;//原文件流

xfilename:string;//临时文件名称

file_ok:tmemorystream; //生成文件的内存流

filesize:integer; //原文件大小

begin

 if FileExists(filename) then

 begin

 //创建内存流

 file_ok:=tmemorystream.Create ;

 //释放资源文件-- 自解压EXE文件

 myRes := TResourceStream.Create(Hinstance, 'myzjy', Pchar('exefile'));

 //将原文件读入内存

 myfile:=tfilestream.Create(filename,fmOpenRead);

 try

 

 myres.Position:=0;

 file_ok.CopyFrom(myres,0);

 file_ok.Seek(0,sofromend);

 myfile.Position:=0;

 file_ok.CopyFrom(myfile,0);

 file_ok.Seek(0,sofromend);

 filesize:=myfile.Size;

 file_ok.WriteBuffer(filesize,sizeof(filesize));

 file_ok.Position:=0;

 xfilename:=ChangeFileExt(filename,'.exe') ;

 file_ok.SaveToFile(xfilename);

 

 finally

 myfile.Free ;

 myres.Free ;

 file_ok.Free ;

 

 end;

 DeleteFile(filename);

 filename:=xfilename;

 

 end;

end;

 

//#####################################################

 

destructor Tmyzip.Destroy;

begin

 

inherited Destroy;

end;

procedure Tmyzip.BitBtn3Click(Sender: TObject);
begin
//OpenDialog1.Execute ;
  if OpenDialog1.Execute then
    edit1.Text := OpenDialog1.Filename;

end;

procedure Tmyzip.BitBtn1Click(Sender: TObject);
begin
ys_file(edit1.Text,'e:\lcb.ex_',edit2.Text,false,0);
end;

procedure Tmyzip.Button1Click(Sender: TObject);
var
zjyfile:string;
begin
zjyfile:='e:\lcb.ex_';
zjywj(zjyfile);
end;

procedure Tmyzip.BitBtn2Click(Sender: TObject);
begin
jy_file('e:\lcb.ex_','edit2');
end;

end.




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -