1、VCLZip压缩多级目录的问题。
2、VCLZip压缩过程的进度显示问题。
请高手解答。

解决方案 »

  1.   

    ...concatenate and compress files into one destination file? 
    Author: Robert Kuhlmann  
    uses 
      Zlib; procedure CompressFiles(Files : TStrings; const Filename : String); 
    var 
      infile, outfile, tmpFile : TFileStream; 
      compr : TCompressionStream; 
      i,l : Integer; 
      s : String; begin 
      if Files.Count > 0 then 
      begin 
        outFile := TFileStream.Create(Filename,fmCreate); 
        try 
          { the number of files } 
          l := Files.Count; 
          outfile.Write(l,SizeOf(l)); 
          for i := 0 to Files.Count-1 do 
          begin 
            infile := TFileStream.Create(Files[i],fmOpenRead); 
            try 
              { the original filename } 
              s := ExtractFilename(Files[i]); 
              l := Length(s); 
              outfile.Write(l,SizeOf(l)); 
              outfile.Write(s[1],l); 
              { the original filesize } 
              l := infile.Size; 
              outfile.Write(l,SizeOf(l)); 
              { compress and store the file temporary} 
              tmpFile := TFileStream.Create('tmp',fmCreate); 
              compr := TCompressionStream.Create(clMax,tmpfile); 
              try 
                compr.CopyFrom(infile,l); 
              finally 
                compr.Free; 
                tmpFile.Free; 
              end; 
              { append the compressed file to the destination file } 
              tmpFile := TFileStream.Create('tmp',fmOpenRead); 
              try 
                outfile.CopyFrom(tmpFile,0); 
              finally 
                tmpFile.Free; 
              end; 
            finally 
              infile.Free; 
            end; 
          end; 
        finally 
          outfile.Free; 
        end; 
        DeleteFile('tmp'); 
      end; 
    end; procedure DecompressFiles(const Filename, DestDirectory : String); 
    var 
      dest,s : String; 
      decompr : TDecompressionStream; 
      infile, outfile : TFilestream; 
      i,l,c : Integer; 
    begin 
      // IncludeTrailingPathDelimiter (D6/D7 only) 
      dest := IncludeTrailingPathDelimiter(DestDirectory);   infile := TFileStream.Create(Filename,fmOpenRead); 
      try 
        { number of files } 
        infile.Read(c,SizeOf(c)); 
        for i := 1 to c do 
        begin 
          { read filename } 
          infile.Read(l,SizeOf(l)); 
          SetLength(s,l); 
          infile.Read(s[1],l); 
          { read filesize } 
          infile.Read(l,SizeOf(l)); 
          { decompress the files and store it } 
          s := dest+s; //include the path 
          outfile := TFileStream.Create(s,fmCreate); 
          decompr := TDecompressionStream.Create(infile); 
          try 
            outfile.CopyFrom(decompr,l); 
          finally 
            outfile.Free; 
            decompr.Free; 
          end; 
        end; 
      finally 
        infile.Free; 
      end; 
    end;
      

  2.   

    至于进度显示,在for循环中控制进度条就可以了
      

  3.   

    1.多级目录要把RelativePaths属性设为True,就会保存好目录结构。
    2.OnTotalPercentDone事件得Percent就是当前的进度值了。
      

  4.   

    1.多级目录要把RelativePaths属性设为True,就会保存好目录结构。
    设置这个不行,只是将当前目录压缩,而本目录下的文件夹则不能压缩。
      

  5.   

    是否设置好FilesList属性?
    建议看看自带的Demo
      

  6.   

    非谢感谢,FilesList怎么设置,这个组件没有Demo啊
    只有一个简单的说明。
      

  7.   

    例如 FilesList.Add('c:\temp\*.*');//压缩c:\temp\下所有文件
    那个说明里应该有讲到的
      

  8.   

    设置Password属性就行了。
    通常压缩时将VCLZip.RelativePaths设成True,解压是将VCLUnZip的RecreateDirs设成True。
      

  9.   

    没有Password属性呢,只有一个事件,BadPassword,要设置密码怎么弄呢
      

  10.   

    不在Object Inspector里设置,用代码写 VCLZip1.Password:='abc';
      

  11.   

    不在Object Inspector里设置,用代码写 VCLZip1.Password:='abc';
    是的呢,没有这个Password
      

  12.   

    或许是版本不同,你用这个版本的试试
    http://www.delphifans.com/SoftView/SoftView_1185.html