unit zZip;interfaceuses Classes,Windows,IniFiles,Variants, Controls, ComObj, Messages, Forms,
  Dialogs, SysUtils,ShellAPI,shlobj,ZLib;type
 pass=string[20];type
 Tmyzip = class
 private
    { private declarations here}
 protected
    { protected declarations here }
 public
   procedure ys_file(infileName, outfileName: string;password:pass;isjm:Boolean;
      filetype:string);
   function jy_Inifile(infileName: string;password:pass=''):Boolean;
   function jy_Regfile(infileName: string;password:pass=''):Boolean;
   procedure jm_RegFile(vFile:string;var Target:TMemoryStream
     ;password:pass;isjm:Boolean);
   procedure jm_IniFile(vFile:string;var Target:TMemoryStream;
     password:pass;isjm:Boolean);  
   constructor Create;
   destructor Destroy; override;
      { public declarations here }
  published
     { published declarations here }
  end;implementationuses zPublic;{ Tmyzip }constructor Tmyzip.Create;
begin
  inherited Create;
end;procedure Tmyzip.jm_RegFile(vFile:string;var Target:TMemoryStream;
  password:pass;isjm:Boolean);
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);
    filename:=ExtractFilePath(paramstr(0))+'tmp.in_';
    inifile:=TInifile.Create(filename);
    inifile.WriteString('ysFilePath','filename',ExtractFileName(vFile));
    inifile.WriteString('PassWordField','password',password);
    inifile.WriteInteger('FileSizeField','filesize',Target.Size);
    inifile.WriteBool('BlJm','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 Tmyzip.jm_IniFile(vFile:string;var Target:TMemoryStream;
  password:pass;isjm:Boolean);
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))+'tmpinter.in_';
    inifile:=TInifile.Create(filename);
    inifile.WriteString('ysFilePath','filename',ExtractFileName(vFile));
    inifile.WriteString('PassWordField','password',password);
    inifile.WriteInteger('FileSizeField','filesize',Target.Size);
...
    inifile.WriteString('jmBeginMoney','sBeginMoney',sBeginMoney);
    inifile.WriteString('jmBeginDiscount','sBeginDiscount',sBeginDiscount);    
    inifile.Free ;//读入 [INI加密压缩信息文件流]
    inistream:=TFileStream.Create(filename,fmOpenread or fmShareExclusive);
    try
       inistream.Position :=0;
       Target.Seek(0,sofromend);
       Target.CopyFrom(inistream,0);
       FileSize:=inistream.Size ;
       Target.WriteBuffer(FileSize,sizeof(FileSize));
    finally
       inistream.Free ;
       deletefile(filename);
    end;
  finally
  tmpstream.Free;
end;
end;procedure ys_stream(instream, outStream: TStream);
var
 ys: TCompressionStream;
begin
 inStream.Position := 0;
 ys := TCompressionStream.Create(clmax,OutStream); //最大压缩
 try
   ys.CopyFrom(inStream, 0);
 finally
   ys.Free;
 end;
end;procedure jy_Stream(instream, outStream: TStream);
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;destructor Tmyzip.Destroy;
begin
  inherited Destroy;
end;procedure Tmyzip.ys_file(infileName, outfileName: string;password:pass;isjm:Boolean;
  filetype:string);
var instream:TMemoryStream;   //文件加密后的临时流
outStream: TFileStream;   //压缩输出文件流
begin
  instream:=TMemoryStream.Create;//创建 [文件加密后的临时流]
  if filetype='RegFiles' then
    jm_Regfile(infileName,instream,password,isjm)
  else
    jm_IniFile(infileName,instream,password,isjm);  //文件加密
  deletefile(infileName);//删除原文件
  outStream := TFileStream.create(outFIleName, fmCreate);//创建压缩输出文件流
  try
   ys_stream(instream,OutStream);//[文件加密后的临时流] 压缩
  finally
    OutStream.free;
    instream.Free ;
  end;
end;function Tmyzip.jy_Regfile(infileName: string;password:pass=''):Boolean;
var
 inStream,inistream: TFileStream;
 outStream:tmemorystream;  //临时内存流
 inifile:TINIFILE; //临时INI文件
 FileSize:integer;  //密码文件的SIZE
begin
  Result:=True;
  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
          OutStream.Seek(-sizeof(FileSize),sofromend);//指向存储解码信息的INTEGER型变量位置
          OutStream.ReadBuffer(FileSize,sizeof(FileSize));//读入变量信息
          OutStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);//指向解码信息位置
          inistream.CopyFrom(OutStream,FileSize);//将解码信息读入INI流中
          inistream.Free ;//释放INI文件流
          inifile:=TINIFILE.Create(ExtractFilePath(paramstr(0))+'tmp.in_');//读入INI文件信息
          sCompanyTel:=inifile.ReadString('jmComPanyTel','sComPanyTel','0');
          inifile.Free;
        finally
          deletefile(ExtractFilePath(paramstr(0))+'tmp.in_');
        end;
      finally
       OutStream.free;
      end;
    finally
     inStream.free;
    end;
  except
    Result:=False;
  end;
end;function Tmyzip.jy_Inifile(infileName: string;password:pass=''):Boolean;
var
 inStream,inistream: TFileStream;
 outStream:tmemorystream;  //临时内存流
 inifile:TINIFILE; //临时INI文件
 FileSize:integer;  //密码文件的SIZE
begin
  Result:=True;
  try
    inStream := TFileStream.create(inFIleName, fmOpenRead);
    try
      outStream := tmemorystream.create;
      try
        jy_stream(insTream,OutStream);//生成临时INI文件
        inistream:=TFileStream.create(ExtractFilePath(paramstr(0))+'tmpinter.in_', fmCreate);
        try
          OutStream.Seek(-sizeof(FileSize),sofromend);//指向存储解码信息的INTEGER型变量位置
          OutStream.ReadBuffer(FileSize,sizeof(FileSize));//读入变量信息
          OutStream.Seek(-(FileSize+sizeof(FileSize)),sofromend);//指向解码信息位置
          inistream.CopyFrom(OutStream,FileSize);//将解码信息读入INI流中
          inistream.Free ;//释放INI文件流
          inifile:=TINIFILE.Create(ExtractFilePath(paramstr(0))+'tmp.in_');//读入INI文件信息
          sBeginMoney:=inifile.ReadString('jmBeginMoney','sBeginMoney','0');
          sBeginDiscount:=inifile.ReadString('jmBeginDiscount','sBeginDiscount','0');
          inifile.Free;
        finally
          deletefile(ExtractFilePath(paramstr(0))+'tmpinter.in_');
        end;
      finally
       OutStream.free;
      end;
    finally
     inStream.free;
    end;
  except
    Result:=False;
  end;
end;end.

解决方案 »

  1.   

    也不知道是那个前辈的代码了,我抄来的.原来我放在一个publicunit里面,可以执行的
    主要问题是在
    procedure Tmyzip.ys_file(infileName, outfileName: string;password:pass;isjm:Boolean;
      filetype:string);
    var instream:TMemoryStream;   //文件加密后的临时流
    outStream: TFileStream;   //压缩输出文件流
    begin
      instream:=TMemoryStream.Create;//创建 [文件加密后的临时流]
    过程,我跟踪到这里的时候原来代码里面instream创建后是有东西的,就是类似一个空的初始化的什么类吧.而我复制出来后发现怎么也执行出来没结果,我跟踪到instream,发现instream创建后为(),真是郁闷请指点.
      

  2.   

    其实我想做的很简单,我想把用户的信息,和配置文件都放在这个加过密的文件里面因为原来写在ini文件,发现ini太容易被用户更改了.比如sql的密码保存(当然你可以说字符串处理一下)
    但有人要动的话删除就说不能执行,公司就要派人去呵呵,很麻烦,于是就加密(或者写注册表).选择加密.请各位看看,这代码哪错了!  或者给个更好的加密方案,最好代码..呵呵.谢谢