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

📄 myfunction.pas

📁 参照上兴、鸽子等源码编写编写出来的。 编译环境:Delphi7+SP+DP+indy9等控件
💻 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 + -