📄 unit1.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 + -