大家好啊!我是Delphi超级菜鸟,而且第一次在这个论坛上逛啊~ 很多东西还不熟悉啊~~~见谅见谅!
我所用的是 Delphi 7,并使用了VCLZip组件。
以下是我想要提问的源代码:procedure TForm2.SpeedButton1Click(Sender: TObject);
begin
  With VCLZip1 do
    begin
      ZipName := '文件目录\实验文件.zip';                 //ZIP文件名
      Destdir:='Temp\';                                     //解压到的目录
      FilesList.Add('*.*');
      DoAll := true;
      Password:='abcdefg';                                      //密码
      Recurse := True;
      StorePaths := true;
      unzip;
    end;
end;这段代码已经成功运行了。
但是现在有个问题,我发现如果目录下的Zip文件,即使是没有密码也会解压。我想请教一下:如何才能做到有密码且正确的解压,没有密码的不解压,最好是还能提示错误。
各位高手帮帮我吧~~~

解决方案 »

  1.   

    没试过,顶一下>>>>>>>>>>>>...
      

  2.   

    惭愧,用delphi也有几年了,没有用过VCLZip。
      

  3.   

    要不这样,换一种方法。能不能检测一个Zip文件是否存在密码,并返回消息?
      

  4.   

    zip,rar这样的机制决定的.他们验证不了密码的正确性.只是用密码做解密运算.
    winzip和winrar都是这样的.输错密码不会提示的.直接解压出一大段解密失败的文件.
      

  5.   

    VCLZip解压,即使密码错了,也不会提示出错,只是创建一个空文件夹而已,如果需要自己判断并给出提示
    其实,通过获取文件数量来判断,也是一个解决办法
    以下是我通用的一个方法,看给你是否有所帮助
    {{
    解压缩文件,当SelFileExt =''时,将压缩文件全部解出来
    如果不等于空,解出来指定后缀名的,当然可以是具体文件名,但有时具体文件名确定不了,
    所以采用后缀名比较好,当解出来以后,再采用文件名来处理更实际。
    其中判断错误密码的是根据需要解出来的文件数目和实际解出来的文件数目对比,
    }
    function UnZipFile(const DesPathName, ZipFileName: string; 
      ZipPassWord: string = '';SelFileExt: string=''): Boolean;
    var
      i,lncount: Integer;
      AZip: TVCLZip;
    begin
      Result := False;
      lncount := 0;
      AZip := TVCLZip.Create(nil);
      try
        with AZip do
        begin
          ZipName := ZipFileName;
          DestDir := DesPathName;
          if ZipPassWord = '' then
            Password := ZiperZBPsw
          else
            Password := ZipPassWord;      OverwriteMode := TUZOverwriteMode(1); //总是覆盖
          ZipAction := TZipAction(0);//
          RecreateDirs := True;
          RetainAttributes := True;
          ReplaceReadOnly := True;
          try
            AZip.ReadZip;
            if SelFileExt = '' then
            begin
              DoAll := True;  //如果设置了这个,即使你unZipSelected也会解出所有的 
              lnCount := Count; 
              i := UnZip ;  
            end
            else
            begin
              for i := 0 to Count - 1 do
                if Pos(SelFileExt,LowerCase(Filename[i]))>0 then 
                begin
                  Selected[i] := True;
                  Inc(lncount);
                end;
              i := UnZipSelected;
            end;
            if i = lncount then
              Result := i <> 0
            else
            begin
              if Assigned(WaitDlgForm) then FreeAndNil(WaitDlgForm);
              if (lncount > 0) and (i = 0) then
                raise Exception.Create('密码错误!')
              else
                raise Exception.Create('无法解密所有文件!');
            end
          except
            on E:Exception do
            begin
              if Assigned(WaitDlgForm) then FreeAndNil(WaitDlgForm);
              if Pos('Incomplete Zip File', E.Message) > 0 then
                MsgBox('不正确的文件格式!')
              else
                MsgBox('解密文件出错:' + E.Message);
              Abort;
            end;
          end;
        end;
      finally
        FreeAndNil(AZip);
      end;
    end;
      

  6.   

    7楼的做法对我有些启发,不过有一个问题还是没能够解决。是这样的,如果我的Zip密码是123,那么我指定解压的Zip自然可以解压,并通过接下来的代码运行这些文件,这个没错。但是,
    如果我原来的Zip被别人的没有密码的Zip替换了的话,我的程序也照样会解压这个Zip并运行这个Zip里面的文件,只要别人的Zip可以把文件名弄得跟我原来的Zip一样就会出现这样的问题。现在主要就是想要实现:没有密码的Zip不解压并提示“不是合法的Zip文件”。请各位高手不吝赐教!
      

  7.   

    还没人能够给出最实用的解决方案啊。如果我不用VCLZip呢?换成SevenZip能解决吗?可是SevenZip的解压代码我不会写啊,网上也找不到啊!帖子我加一点点分了,昨天刚加入这个论坛,分数有限,大家见谅~
      

  8.   

    呵呵~!我自己已经通过其他论坛找到方法了,但是没法自己给自己的答案分数,也没法结贴,所以另外注册了一个帐号。我把思路拿来这里分享一下。——声明:本答案引用至http://wenwen.soso.com/z/q296712861.htm?ch=gr.new.grdt先不带密码尝试解压一次或者获取信息一次,如果失败了就说明有密码。begin
    With UnZip1 do
      begin
        UnZip1.ArchiveStream:=TFileStream.Create('文件目录\实验文件.zip',fmOpenRead); 
                                                         //文件流打开压缩包
         if UnZip1.CheckArchive then       //无密码检测压缩包
           begin
            showmessage('错误!');
            UnZip1.ArchiveStream.Free; //关闭文件流
             exit;   //结束执行后面的代码,即做到了 无密码,不解压。
           end;
         …………………………………………      //解压过程,楼主的方面修改下就行。
         UnZip1.ArchiveStream.Free; //关闭文件流
       end;
      

  9.   

    zipTv很好用。
    但是我遇到奇怪的问题,unrar在我开发电脑上正常工作,换台电脑,不解压缩了。