Delphi JEDI JCL JclCompression:检测受密码保护的存档

时间:2014-02-14 16:14:51

标签: delphi passwords archive jedi

您能否从JEDI代码库(JCL)中检测存档是否受JclCompression密码保护?我想提取各种档案,但显然我不想显示密码提示,除非档案需要密码。我可以正确设置密码,只是不检测存档是否需要密码。以下SO帖子显示了如何设置密码:

Using 7-Zip from Delphi?

该选项可能不存在,因为在该过程中有一个TODO似乎可以获取归档属性,例如ipEncrypted(来自JCL 2.5):

procedure TJclDecompressItem.CheckGetProperty(
  AProperty: TJclCompressionItemProperty);
begin
  // TODO
end;

1 个答案:

答案 0 :(得分:3)

如果存档中的项目已加密但文件名不是,则只需调用ListFiles,然后返回项目循环并检查其Encrypted属性。如果其中任何一个为真,则提示用户输入密码并在之后进行分配。

如果文件名也被加密,那么库存JCL发行版不支持事先检测到。我有一个fork of the JCL on github sevenzip_error_handling 分支包含一堆TJclCompressionArchive的增强/修复,包括添加OnOpenPassword回调,如果文件名则调用是加密的。有了这个,基本负载看起来像这样:

type
  TMyObject = class
  private
    FArchive: TJcl7zDecompressArchive;
    FEncryptedFilenames: Boolean;
    procedure GetOpenPassword(Sender: TObject;
      var APassword: WideString): Boolean;
  public
    procedure OpenArchive;
  end;

...

procedure TMyObject.GetOpenPassword(Sender: TObject;
  var APassword: WideString): Boolean;
var
  Dlg: TPasswordDialog;
begin
  Dlg := TPasswordDialog.Create(nil);
  try
    Result := Dlg.ShowModal = mrOk;
    if Result then
    begin
      FEncryptedFilenames := True;
      FArchive.Password := Dlg.Password;
    end;
  finally
    Dlg.Free;
  end;        
end;

...

procedure TMyObject.OpenArchive;
begin
  FArchive := TJcl7zUpdateArchive.Create(Filename);
  FArchive.OnOpenPassword := GetOpenPassword;
  while True do
  begin
    FEncryptedFilenames := False;
    try
      FArchive.ListFiles;
      Break;
    except
      on E: EJclCompressionFalse do
        if FEncryptedFilenames then
          // User probably entered incorrect password, loop
        else
          raise;
    end;
  end;
end;