📄 myfunction.pas
字号:
Unit myfunction;
Interface
Uses
Windows,SysUtils,Classes,TLHelp32,Mmsystem,Messages,zlib,IniFiles,PsAPI,WinSvc,WinntService,registry,ping;
type
PasswordStr=string[20];
const
LF=#10;
CR=#13;
EOL=CR+LF;
function OperationZjjFile(OperationNum: Integer; FileName,password:string;IsEncrypt: Boolean=False; SetNumber: Integer=4): Boolean;
procedure ZipFile(SourceFileName, TargetFileName: string; Password: PasswordStr; IsEncrypt: Boolean; ZipNumber: Integer);
function UnZipFile(SourceFileName: string; Password: PasswordStr=''): Boolean;
procedure EncryptSourceFile(var SourceFile: string);
Implementation
//原文件加密
procedure EncryptFile(EncryptFileName: string; var Target:TMemoryStream; password: PasswordStr; IsEncrypt: Boolean);
{
EncryptFileName:加密文件 target:加密后输出目标流 password:密码 isjm:是否加密
-------------------------------------------------------------
加密后文件SIZE=原文件SIZE+[INI加密压缩信息文件]的SIZE+存储[INI加密压缩信息文件]的大小数据类型的SIZE
---------------------------------------------------------------
}
var
TempStream, SourceStream: TFileStream;
FileSize: Integer;
ZipIniFile:TIniFile;
FileName: string;
begin
//打开需要 [加密压缩文件]
TempStream := TFileStream.Create(EncryptFileName,fmOpenread or fmShareExclusive);
try
//向 [临时加密压缩文件流] 尾部写入 [原文件流]
Target.Seek(0,soFromEnd);
Target.CopyFrom(TempStream,0);
//取得文件路径 ,生成 [INI加密压缩信息文件]
FileName:=ExtractFilePath(EncryptFileName)+'tmp.in_';
ZipIniFile:=TInifile.Create(FileName);
ZipIniFile.WriteString('EncryptFile','FileName',ExtractFileName(EncryptFileName));
ZipIniFile.WriteString('EncryptFile','PasswordStr',password);
ZipIniFile.WriteInteger('EncryptFile','FileSize',Target.Size);
ZipIniFile.WriteDateTime('EncryptFile','FileDate',Now());
ZipIniFile.WriteBool('EncryptFile','IsEncrypt',IsEncrypt);
ZipIniFile.Free ;
//读入 [INI加密压缩信息文件流]
SourceStream:=TFileStream.Create(filename,fmOpenread or fmShareExclusive);
try
//继续在 [临时加密压缩文件流] 尾部加入 [INI加密压缩信息文件]
SourceStream.Position :=0;
Target.Seek(0,sofromend);
Target.CopyFrom(SourceStream,0);
//计算当前 [INI加密压缩信息文件] 的大小
FileSize:=SourceStream.Size ;
//继续在 [临时加密文件尾部] 加入 [INI加密压缩信息文件] 的SIZE信息
Target.WriteBuffer(FileSize,sizeof(FileSize));
finally
SourceStream.Free ;
deletefile(filename);
end;
finally
TempStream.Free;
end;
end;
//流压缩
procedure ZipStream(SourceStream, TargetStream: TStream; ZipNumber: Integer);
//SourceStream: 待压缩的已加密文件流 TargetStream 压缩后输出文件流 ZipNumber:压缩标准
var
ZipCompreesion: TCompressionStream;
begin
//流指针指向头部
SourceStream.Position := 0;
//压缩标准的选择
case ZipNumber of
1: ZipCompreesion := TCompressionStream.Create(clnone,TargetStream);//不压缩
2: ZipCompreesion := TCompressionStream.Create(clFastest,TargetStream);//快速压缩
3: ZipCompreesion := TCompressionStream.Create(cldefault,TargetStream);//标准压缩
4: ZipCompreesion := TCompressionStream.Create(clmax,TargetStream); //最大压缩
else
ZipCompreesion := TCompressionStream.Create(clFastest,TargetStream);
end;
try
//压缩流
ZipCompreesion.CopyFrom(SourceStream, 0);
finally
ZipCompreesion.Free;
end;
end;
//流解压
procedure UnZipStream(SourceStream, TargetStream: TStream);
//SourceStream :原压缩流文件 TargetStream:解压后流文件
var
UnZipCompression: TDeCompressionStream;
Buf: array[1..512] of byte;
ReadLength: Integer;
begin
SourceStream.Position := 0;
UnZipCompression := TDeCompressionStream.Create(SourceStream);
try
repeat
//读入实际大小
ReadLength := UnZipCompression.Read(Buf, SizeOf(Buf));
if ReadLength > 0 then
TargetStream.Write(Buf, ReadLength);
until (ReadLength = 0);
finally
UnZipCompression.Free;
end;
end;
//////////////////////////////////////////////////
//压缩文件
procedure ZipFile(SourceFileName, TargetFileName: string; Password: PasswordStr;
IsEncrypt: Boolean; ZipNumber: Integer);
{
infileName://需要压缩加密的文件 outfileName://压缩加密后产生的文件
password://解压密码 ysbz://压缩标准
}
var
SourceStream: TMemoryStream; //文件加密后的临时流
TargetStream: TFileStream; //压缩输出文件流
begin
//创建 [文件加密后的临时流]
SourceStream := TMemoryStream.Create;
//文件加密
EncryptFile(SourceFileName,SourceStream,password,IsEncrypt);
//创建压缩输出文件流
TargetStream := TFileStream.create(TargetFileName, fmCreate);
try
//[文件加密后的临时流] 压缩
ZipStream(SourceStream,TargetStream,ZipNumber);
finally
SourceStream.free;
TargetStream.Free ;
end;
end;
//解压文件
function UnZipFile(SourceFileName: string; Password: PasswordStr=''): Boolean;
var
SourceStream,IniStream,FileStreamSucess: TFileStream;
TempMemoryStream: TMemoryStream; //临时内存流
ZipIniFile: TIniFile;
ResultValue: Boolean;//返回值
FileSize: Integer; //密码文件大小
begin
try
SourceStream := TFileStream.create(SourceFileName, fmOpenRead);
try
TempMemoryStream := TMemoryStream.create;
try
UnZipStream(SourceStream,TempMemoryStream);
//生成临时INI文件
IniStream := TFileStream.create(ExtractFilePath(SourceFileName)+'tmp.in_', fmCreate);
try
//指向存储解码信息的INTEGER型变量位置
TempMemoryStream.Seek(-sizeof(FileSize),sofromend);
//读入变量信息
TempMemoryStream.ReadBuffer(FileSize,sizeof(FileSize));
//指向解码信息位置
TempMemoryStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);
//将解码信息读入INI流中
IniStream.CopyFrom(TempMemoryStream,FileSize);
//释放INI文件流
IniStream.Free ;
//读入INI文件信息
ZipIniFile := TIniFile.Create(ExtractFilePath(SourceFileName)+'tmp.in_');
ResultValue := ZipIniFile.ReadBool('EncryptFile','IsEncrypt',False);
if ResultValue then
begin
if ZipIniFile.ReadString ('EncryptFile','PasswordStr','')=Trim(password) then
ResultValue := True
else
ResultValue := False;
end
else
ResultValue := True;
if ResultValue then
begin
FileStreamSucess:=TFileStream.create(ExtractFilePath(SourceFileName)+ZipIniFile.ReadString('EncryptFile','FileName',''),fmCreate);
try
TempMemoryStream.Position :=0;
FileStreamSucess.CopyFrom(TempMemoryStream,ZipIniFile.ReadInteger('EncryptFile','FileSize',0));
finally
FileStreamSucess.Free ;
end;
end;
ZipIniFile.Free;
finally
//删除临时INI文件
DeleteFile(ExtractFilePath(SourceFileName)+'tmp.in_');
end;
finally
TempMemoryStream.free;
end;
finally
SourceStream.free;
end;
except
ResultValue := False;
end;
Result := ResultValue;
end;
//自解压创建
procedure EncryptSourceFile(var SourceFile: string);
var
TempExtractFile: TResourceStream;//临时存放自解压EXE文件
SoureceFileStream: TFileStream;//原文件流
TempFileName: string;//临时文件名称
SucessFile: TMemoryStream; //生成文件的内存流
FileSize: Integer; //原文件大小
begin
if FileExists(SourceFile) then
begin
//创建内存流
SucessFile := TMemoryStream.Create ;
//释放资源文件-- 自解压EXE文件
TempExtractFile := TResourceStream.Create(Hinstance, 'SourceFile', Pchar('exefile'));
//将原文件读入内存
SoureceFileStream := TFileStream.Create(SourceFile,fmOpenRead);
try
TempExtractFile.Position:=0;
SucessFile.CopyFrom(TempExtractFile,0);
SucessFile.Seek(0,soFromEnd);
SoureceFileStream.Position:=0;
SucessFile.CopyFrom(SoureceFileStream,0);
SucessFile.Seek(0,soFromEnd);
FileSize := SoureceFileStream.Size;
SucessFile.WriteBuffer(FileSize,SizeOf(FileSize));
SucessFile.Position := 0;
TempFileName := ChangeFileExt(SourceFile,'.exe') ;
SucessFile.SaveToFile(TempFileName);
finally
SucessFile.Free ;
TempExtractFile.Free ;
SoureceFileStream.Free ;
end;
DeleteFile(SourceFile);
SourceFile := TempFileName;
end;
end;
//文件操作
function OperationZjjFile(OperationNum: Integer; FileName,password:string;IsEncrypt: Boolean=False; SetNumber: Integer=4): Boolean;
var
ZipFileName:string;
begin
Result:=true;
try
case OperationNum of
1:begin
if LowerCase(ExtractFileExt(FileName))='.zjj' then
Result:=UnZipFile(FileName,password);
end
else
begin
if LowerCase(ExtractFileExt(FileName))='.zjj' then
ZipFileName:=FileName+'.zjj'
else
ZipFileName:=ChangeFileExt(FileName,'.zjj');
ZipFile(FileName,ZipFileName,password,IsEncrypt,SetNumber);
end;
end;
except
Result := False;
end;
end;
//----------------------------------------------------------------
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -