飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2805|回复: 0

数据压缩 -- 应用

[复制链接]
  • TA的每日心情
    开心
    2019-9-19 16:05
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-2-8 10:25:50 | 显示全部楼层 |阅读模式
    例:多个目录下多个文件压缩到一个文件;
        对压缩文件解压到个对应目录。
       //压缩文件流: 文件名长度 + 文件名 + 文件长度 + 压缩流
       
    uses Lh5Unit.pas;   //见  数据压缩 -- 源码

    procedure Compress;
    var
      fOutStr: TFileStream;                                  //压缩文件流  

      function doOneFile(srcFile:string):boolean;            //把一个文件压缩到 压缩文件流
      var fInStr: TFileStream;
          fTmp:TmemoryStream;
          fnLen,sz:integer;
      begin
        result:=true;
        if not fileExists(srcFile) then exit;
        try
          fInStr := TFileStream.Create(srcFile,fmOpenRead);
          fTmp   := TmemoryStream.create;
          try
            //在目标流 插入文件名长度 ,文件名,文件长度
            fnLen :=length(srcFile);
            fOutStr.Write(fnLen,sizeof(integer));      //文件名长度       // 或 sizeof(I)
            fOutStr.Write(pFileName[1],fnLen);         //文件名
            LHACompress(fInStr, fTmp);                 //压缩文件 到 TmemoryStream
            sz:=fTmp.Size ;
            fOutStr.Write(sz,sizeof(integer));         //文件压缩长度
            fOutStr.write(fTmp.Memory^,sz);             //压缩流
          finally
            fInStr.Free;
            fTmp.free;
          end;
        except
          result:=false;
        end;
      end;

    var
      lhFile,aFileName:string;
    begin
      result:=true;
      try
        lhFile:=ExtractFilePath(application.ExeName)+'filePack.LHZ';  //压缩文件名
        if fileExists(lhFile) then DeleteFile(lhFile);

        fOutStr := TFileStream.Create(lhFile,fmCreate);
        try
            .....  //检索要压缩的文件列表
            openSQL('select HtmFile from FAQ where Flags=1 order by HtmFile',data.tbLHZ);

            while not data.tbLHZ.eof do
            begin
              aFileName:='FAQfile\'+data.tbLHZ.FieldByname('HtmFile').asString+'.html';
              if not doOneFile(ExtractFilePath(application.ExeName)+aFileName,aFileName) then
              begin
                result:=false;  //压缩不成功
                break;
              end;
              data.tbLHZ.next;
            end;      
        finally
          fOutStr.Free;
        end;
      except
        result:=false;  //压缩不成功
      end;
    end;

    function Expand(lhFile:string): boolean;
    var
      Src_f:Tfilestream;

      function getOneFile(aFileLen:integer;tFileName:string):boolean;
      var
          dst_f:Tfilestream;
          Mem_f:TmemoryStream;
      begin
        result:=true;
        try  
          if fileExists(tFileName) then deletefile(aFile); //已存在,覆盖它

          dst_f := Tfilestream.create(aFile,fmcreate or fmopenwrite);
          Mem_f := TmemoryStream.create;
          try
            if Mem_f.CopyFrom(src_f,aFileLen)<>aFileLen then raiselastWin32Error; //获取压缩流
            Mem_f.position := 0;

            LHAExpand(Mem_f,dst_f);                    //解压

          finally
            dst_f.free;
            Mem_f.free;
          end;
        except
          result:=false;
        end;
      end;

    var
       aFileName:string;
       fnlen,fSize:integer;
    begin
      if not fileExists(lhFile) then exit; //压缩文件不存在!  filePack.LHZ

      result:=true;
      try
      src_f := TFileStream.Create(lhFile,fmOpenRead);
      //从临时文件中分离出所有文件的实体
      //src_f 源文件流:  文件名长度 + 文件名 + 文件压缩长度 + 压缩流(被压文件)
      try
        src_f.position := 0;
        while true do begin
          if src_f.size <=src_f.position+1 then break;           //(2.0)如果 iRtn<=0 则文件流读取结束
                                                      
          if src_f.Read(fnlen,sizeof(integer))<=0 then break;    //(2.1)取得文件名长度
          setLength(aFileName,fnlen);                 
          if src_f.Read(aFileName[1],fnlen)<=0 then break;       //(2.2)取得文件名
                                                      
          if src_f.Read(fSize,sizeof(integer))<=0 then break;    //(2.3)取得压缩长度

          if getOneFile(fSize,aFileName) then                    //(2.4)获取压缩文件
          begin                                       
            frmMsg.moMsgs.lines.add(aFileName+' 解压缩成功!');  frmMsg.Update ;
          end else
          begin
            frmMsg.moMsgs.lines.add(aFileName+' 解压缩不成功!');  frmMsg.Update ;
          end;
        end;  
      finally
        src_f.free;
      end;
      except
        result:=false;
      end;
    end;
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表